創建線程的第一種方式: 這種方式的特點(缺陷):線程任務和線程是綁定在一起的。 示例: 四個視窗同時賣票 因為是同時,所以使用多線程。 創建四個線程,都是賣票。 因為都是賣票,所以四個線程的任務是一樣的。 只需要定義一個類繼承Thread。 為瞭解決四個線程共用票的問題,需要使用創建線程的第二種方式 ...
創建線程的第一種方式:
- 創建一個類繼承Thread
- 重寫Thread中的run方法 (創建線程是為了執行任務 任務代碼必須有存儲位置,run方法就是任務代碼的存儲位置。)
- 創建子類對象,其實就是在創建線程
- 啟動線程start()
這種方式的特點(缺陷):線程任務和線程是綁定在一起的。
示例:
四個視窗同時賣票,
因為是同時,所以使用多線程。
創建四個線程,都是賣票。
因為都是賣票,所以四個線程的任務是一樣的。
只需要定義一個類繼承Thread。
1 class Ticket extends Thread 2 { 3 private static int num = 50; //定義成static,四個線程共用50張票。 4 public void run() 5 { 6 while(num>0) 7 System.out.println(Thread.currentThread().getName()+"...sale..."+num--); 8 } 9 } 10 11 class Maipiao 12 { 13 public static void main(String[] args) 14 { 15 Ticket win1 = new Ticket(); 16 Ticket win2 = new Ticket(); 17 Ticket win3 = new Ticket(); 18 Ticket win4 = new Ticket(); 19 20 win1.start(); 21 win2.start(); 22 win3.start(); 23 win4.start(); 24 } 25 }
為瞭解決四個線程共用票的問題,需要使用創建線程的第二種方式:
- 創建實現了Runnable介面的子類
- 重寫Runnable介面中的run方法
- 創建實現了Runnable介面的子類的對象
- 創建Thread類的對象,也就是在創建線程
- 把實現了Runnable介面的子類對象作為參數傳遞給Thread類的構造方法
這種方式的特點是:把線程任務進行了描述,也就是面向對象,從而實現了線程任務和線程對象的分離。線程執行什麼任務不再重要,只要是實現了Runnable介面的子類對象都可以作為參數傳遞給Thread的構造方法,此方式較為靈活。
第二種方式還有一個好處是實現介面了,還不影響繼承其他父類。
1 //這個類只是為了描述線程的任務,跟線程沒有任何關係。 2 class Ticket implements Runnable 3 { 4 private int num = 50; 5 public void run() 6 { 7 while(num>0) 8 System.out.println(Thread.currentThread().getName()+"...sale..."+num--); 9 } 10 } 11 12 class Maipiao 13 { 14 public static void main(String[] args) 15 { 16 Ticket t = new Ticket(); 17 18 Thread win1 = new Thread(t); 19 Thread win2 = new Thread(t); 20 Thread win3 = new Thread(t); 21 Thread win4 = new Thread(t); 22 23 win1.start(); 24 win2.start(); 25 win3.start(); 26 win4.start(); 27 } 28 }
總結:為什麼創建線程的第二種方式可以解決賣票問題?
第一種創建線程的方式:線程和線程任務是綁定在一起的,創建了4個線程就創建了4份資源。
第二種創建線程的方式:線程和線程任務進行了分離,只需要創建一個任務,讓4個線程分別去執行。