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