實現多執行緒得兩種方法:Thread類整合和Runnable介面實現
- 建立執行緒的第一種方式:繼承Thread類。
步驟:
1,定義類繼承Thread。
2,複寫Thread類中的run方法。
目的:將自定義程式碼儲存在run方法。讓執行緒執行。//run();僅僅是物件呼叫方法。而執行緒建立了,並沒有執行。
3,呼叫執行緒的start方法,
該方法兩個作用:啟動執行緒,呼叫run方法。
Demo d = new Demo();//建立好一個執行緒。
//d.start();//開啟執行緒並執行該執行緒的run方法。
d.run();//僅僅是物件呼叫方法。而執行緒建立了,並沒有執行。
- l 建立執行緒的第二種方式:實現Runable介面
步驟:
1,定義類實現Runnable
2,覆蓋Runnable介面中的run方法。
將執行緒要執行的程式碼存放在該run方法中。
3,通過Thread類建立執行緒物件。
4,將Runnable介面的子類物件作為實際引數傳遞給Thread類的建構函式。
為什麼要將Runnable介面的子類物件傳遞給Thread的建構函式。
因為,自定義的run方法所屬的物件是Runnable介面的子類物件。
所以要讓執行緒去指定指定物件的run方法。就必須明確該run方法所屬物件。
5,呼叫Thread類的start方法開啟執行緒並呼叫Runnable介面子類的run方法。
- l 實現方式和繼承方式有什麼區別呢?
實現方式好處:避免了單繼承的侷限性。
在定義執行緒時,建立使用實現方式。
兩種方式區別:
繼承Thread: 執行緒程式碼存放Thread子類run方法中。
實現Runnable,執行緒程式碼存在介面的子類的run方法。
實現Runnable介面相對於繼承Thread類來說,有如下的顯著優勢:
1.適合多個相同程式碼的執行緒去處理同一個資源的情況
2.可以避免由於java的單繼承特性帶來的侷限
3.增強了程式的健壯性,程式碼能夠被多個執行緒共享,程式碼與資料時獨立的
給你個例子,你自己取執行就知道了,好好對比下
1 class MyThread extends Thread{ // 繼承Thread類,作為執行緒的實現類2 private int ticket = 5 ; // 表示一共有5張票 3 public void run(){ // 覆寫run()方法,作為執行緒 的操作主體 4 for(int i=0;i<100;i++){ 5 if(this.ticket>0){ 6 System.out.println("賣票:ticket = " + ticket--) ; 7 } 8 } 9 } 10 }; 11 public class ThreadDemo0{ 12 public static void main(String args[]){ 13 MyThread mt1 = new MyThread() ; // 例項化物件 14 MyThread mt2 = new MyThread() ; // 例項化物件 15 MyThread mt3 = new MyThread() ; // 例項化物件 16 mt1.run() ; // 呼叫執行緒主體 17 mt2.run() ; // 呼叫執行緒主體 18 mt3.run() ; // 呼叫執行緒主體 19 } 20 }; 21 22 23 class MyThread implements Runnable{ // 繼承Thread類,作為執行緒的實現類 24 private int ticket = 5 ; // 表示一共有5張票 25 public void run(){ // 覆寫run()方法,作為執行緒 的操作主體 26 for(int i=0;i<100;i++){ 27 if(this.ticket>0){ 28 System.out.println("賣票:ticket = " + ticket--) ; 29 } 30 } 31 } 32 }; 33 public class RunnableDemo0{ 34 public static void main(String args[]){ 35 MyThread mt = new MyThread() ; // 例項化物件 36 new Thread(mt).run() ; // 呼叫執行緒主體 37 new Thread(mt).run() ; // 呼叫執行緒主體 38 new Thread(mt).run() ; // 呼叫執行緒主體 39 } 40 };
簡單的來說,就是繼承和實現介面的區別。
1、當使用繼承的時候,主要是為了不必重新開發,並且在不必瞭解實現細節的情況下擁有了父類我所需要的特徵。它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程式必須繼承自 Applet 類),則無法再繼承 Thread 類,
2、java只能單繼承,因此如果是採用繼承Thread的方法,那麼在以後進行程式碼重構的時候可能會遇到問題,因為你無法繼承別的類了,在其他的方面,兩者之間並沒什麼太大的區別。
3、implement Runnable是面向介面,擴充套件性等方面比extends Thread好。
4、使用 Runnable 介面來實現多執行緒使得我們能夠在一個類中包容所有的程式碼,有利於封裝,它的缺點在於,我們只能使用一套程式碼,若想建立多個執行緒並使各個執行緒執行不同的程式碼,則仍必須額外建立類,如果這樣的話,在大多數情況下也許還不如直接用多個類分別繼承 Thread 來得緊湊。