1.通過extends Thread
1 /* 2 需求:簡單的賣票,多個窗口同時買票 3 (共用資源) 4 創建線程的第二種方式:實現Runnable接口 5 6 步驟: 7 1,定義類實現Runnable接口 8 2,覆蓋/重寫Runnable接口中的run方法 9 將將線程要運行的代碼存放在該run方法中 10 3,通過Thread類建立線程對象 11 4,將Runnable接口的子類對象作為實際參數傳遞給Thread類的構造函數 12 為什么要將Runnable接口的子類對象傳遞給Thread的構造參數呢? 13 答:自定義的run方法(自定義代碼塊存儲在這里)是屬於Runnable接口的子類對象 14 所以要讓線程去指定對象的run方法,就必須明確該run方法所屬對象 15 5,調用Thread類的start方法開啟線程並調用Runnable接口的子類方法 16 17 實現方式(implements)和繼承(extends)方式的區別: 18 19 實現方式的好處:避免了單繼承的局限性 20 在定義線程時,最好使用實現方式 21 22 兩種方式的區別: 23 繼承Thread:線程代碼存放Thread子類run方法中 24 實現Runnable:線程代碼存放在接口子類的run方法中 25 */ 26 class Ticket extends Thread 27 { 28 Ticket(String name) 29 { 30 super(name); //構造函數:設置線程名稱 31 } 32 private int ticket =100; 33 public void run() 34 { 35 while(true) 36 { 37 if(ticket>0) 38 { 39 System.out.println(Thread.currentThread().getName()+"還有余票數:"+ticket--); 40 } 41 } 42 } 43 } 44 class TicketDemo 45 { 46 public static void main(String[] args) 47 { 48 Ticket t1 = new Ticket("票窗口1"); 49 Ticket t2 = new Ticket("票窗口2"); 50 Ticket t3 = new Ticket("票窗口3"); 51 Ticket t4 = new Ticket("票窗口4"); 52 53 t1.start(); 54 t2.start(); 55 t3.start(); 56 t4.start(); 57 System.out.println("Hello World!"); 58 } 59 }
2,通過implents Runnable:
class Ticket implements Runnable //extends Thread { private int ticket =100; public void run() { while(ticket>0) { System.out.println(Thread.currentThread().getName()+"還有余票數:"+ticket--); } } } class TicketDemo { public static void main(String[] args) { Ticket t =new Ticket(); Thread t1 = new Thread(t,"票窗口1"); Thread t2 = new Thread(t,"票窗口2"); Thread t3 = new Thread(t,"票窗口3"); Thread t4 = new Thread(t,"票窗口4"); t1.start(); t2.start(); t3.start(); t4.start(); System.out.println("Hello World!"); } }
注釋說明:
1,無需suprname,故刪除。
2,通過jdk手冊可以看到Thread構造函數有該格式:
Thread(Runnable target, String name)
分配新的 Thread
對象。
所有,可直接加對象名稱
錯誤方式:
class TicketDemo { public static void main(String[] args) { Ticket t =new Ticket(); Thread t1 = new Thread(t,"票窗口1"); t1.start(); t1.start(); t1.start(); t1.start(); System.out.println("Hello World!"); } }
該方法導致t1線程不同的從運行態切換回來,所以程序報錯:
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at TicketDemo.main(TicketDemo.java:48)