(一)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接口多线程