多线程(五)---Runnable与Thread类比较
(一)Thread类,模拟售票发现线程资源被共享,如何解决此问题?
1 : 可以用static修饰符、或者单例模式,可以暂时解决此问题,不过不建议使用。
2 : 代码分析堆栈中的状态?
注:多次启动线程是非法的。特别是当线程已经执行结束后,不能重新启动。将抛出IllegalThreadStateException错误
此时我们需要将线程资源和线程任务进行分离!!!!
(二)Runnable实现方式
1:定义一个类实现Runnable
2:覆盖Runnable接口中的run方法,并将线程任务写在方法中
3:通过Thread类创建线程对象,并将实现Runnable接口对象,作为Thread类构造函数的参数进行传递
4:启动start方法,开启线程
class SaleTicket2 implements Runnable{
private int tickets = 100;
public void run(){
while (true){
if (tickets>0){
System.out.println(Thread.currentThread().getName()+"------tickets:"+tickets--);
}
}
}
}
public class TicketDemo2 {
public static void main(String[] args) {
SaleTicket2 t = new SaleTicket2(); // 线程任务对象
Thread t1 = new Thread(t);// 创建线程对象并且并将实现了Runnable接口对象作为Thread构造函数的参数进行传递
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
(三)实现Runnable接口与继承Thread类两种方式分析?
实现Runnable接口的好处:
1: 避免了继承Thread类的单继承的局限性
2: Runnable接口的出现更符合面向对象,将线程单独的进行对象封装
3: Runnable接口出现,降低了线程对象和线程任务的耦合性
所以综上所述:创建线程推荐使用Runnable接口