拋開線程池不說,創建線程有兩種方式
創建線程的第一種方式:
這種方式的特點(缺陷):線程任務和線程是綁定在一起的。
示例:
四個窗口同時賣票,
因為是同時,所以使用多線程。
創建四個線程,都是賣票。
因為都是賣票,所以四個線程的任務是一樣的。
只需要定義一個類繼承Thread。
class Ticket extends Thread { private static int num = 50; //定義成static,四個線程共享50張票。 public void run() { while(num>0) System.out.println(Thread.currentThread().getName()+"...sale..."+num--); } } class Maipiao { public static void main(String[] args) { Ticket win1 = new Ticket(); Ticket win2 = new Ticket(); Ticket win3 = new Ticket(); Ticket win4 = new Ticket(); win1.start(); win2.start(); win3.start(); win4.start(); } }
這種方式創建線程不可取,為什麼呢?作比較,往下看
創建線程的第二種方式:
這種方式的特點是:把線程任務進行了描述,也就是面向對象,從而實現了線程任務和線程對象的分離。線程執行什麼任務不再重要,只要是實現了Runnable接口的子類對象都可以作為參數傳遞給Thread的構造方法,此方式較為靈活。
第二種方式還有一個好處是實現接口了,還不影響繼承其他父類。
//這個類只是為了描述線程的任務,跟線程沒有任何關系。 class Ticket implements Runnable { private int num = 50; public void run() { while(num>0) System.out.println(Thread.currentThread().getName()+"...sale..."+num--); } } class Maipiao { public static void main(String[] args) { Ticket t = new Ticket(); Thread win1 = new Thread(t); Thread win2 = new Thread(t); Thread win3 = new Thread(t); Thread win4 = new Thread(t); win1.start(); win2.start(); win3.start(); win4.start(); } }
通過代碼,總結得出:
為什麼創建線程的第二種方式可以解決賣票問題?
第一種創建線程的方式:線程和線程任務是綁定在一起的,創建了4個線程就創建了4份資源。
第二種創建線程的方式:線程和線程任務進行了分離,只需要創建一個任務,讓4個線程分別去執行。