您的位置:首页 > 编程语言 > Java开发

java

2016-12-22 15:44 183 查看
多线程第二种实现方式的好处是什么?


实现了Runnable接口,比如一个student类继承了Person类,又实现了runnable接口,Runnable仅仅是将线程任务进行了对象的封装。

Runnable r = new Student();

Thread t = new Thread(r);

实现Runnable接口的好处:

1,将线程的任务从线程的子类中分离出来,进行了单独的封装

按照面向对象的思想将任务封装成了对象

2,避免了java单继承的局限性。

所以创建线程的第二种方式较为常用。

class Ticket implements Runnable{
private int num = 100;
Object obj = new Object();
public void run(){
while(true){
synchronized (obj) {
if(num > 0){
/*
* 这样实际上卖了400张票,为什么?实际上每个线程都操作了100张票。
*      用静态实现数据共享行不行?
*      多次启动一个线程是违法的
*
*      线程安全问题产生的原因:
*          1,多个线程在同时操作共享数据
*          2,操作共享数据的代码有多条
*      这样就导致了线程的安全问题的产生。:
* 怎么解决?
* 将共享数据封装起来,当一个线程执行的时候,其他线程不能参与运算这些数据,
* 这个线程结束后,才能让其他的线程继续执行。
*
* 关键字:synchronized
* 在java中,用同步代码块就可以解决这个问题。
*
* synchronized(对象){//标记
*      需要被同步的代码块;
* }
*
*
* */
System.out.println(Thread.currentThread().getName()+"...." + num--);
}
}
}
}
}

public class TicketDemo {
public static void main(String[]args){

Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
//      Ticket t2 = new Ticket();
//      Ticket t3 = new Ticket();
//      Ticket t4 = new Ticket();

t1.start();
t2.start();
t3.start();
t4.start();
//      t1.start();
//      t2.start();
//      t3.start();
//      t4.start();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java