java,
分享于 点击 45550 次 点评:186
java,
多线程第二种实现方式的好处是什么?
实现了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();
}
}
相关文章
- 暂无相关文章
用户点评