Java多執行緒的使用(二)

abcjob發表於2021-09-09

今天來講講Java如何建立一個執行緒。

大多數情況下,透過例項化一個Thread物件來建立一個執行緒,Java定義了兩種方式:

  • 實現Runnable介面

  • 繼承Thread類

實現Runnable介面

建立執行緒的最簡單的方法就是建立一個Runnable口的類。Runnable抽象了一個執行程式碼單元。為實現Runnable介面,一個類僅需實現一個run()的簡單方法,在run()方法中可以定義程式碼來構建新的執行緒。建立一個執行緒必須理解下面這段話:

run()方法能夠讓主執行緒那樣呼叫其他方法,引用其他類,宣告變數。僅有的不同的是run()方法在程式中確立另一個併發的執行緒執行入口。當run()方法執行完畢時,該執行緒結束。

在你已經建立了實現Runnable介面的類以後,你要在類內部例項化一個Thread類的物件。

Thread(Runnable threadOb,String threadName)

該建構函式中,threadOb時一個實現Runnable介面的實現類,threadName引數則是你新建執行緒的執行緒名稱,這定義了執行緒執行的起點。

建立了新的執行緒,它並不能執行,需要呼叫start方法來執行執行緒的run()方法。本質上,start()方法執行的是一個對run()的呼叫。

  1. public class Test1 {  

  2.   

  3.     public static void main(String[] args) throws InterruptedException {  

  4.         new XkThread();  

  5.         try {  

  6.             for(int i=1;i

  7.                 Thread.currentThread().sleep(1000);//讓當前執行緒睡眠1秒      

  8.                 System.out.println("大家好,我是主執行緒:"+i);  

  9.             }  

  10.             //需要捕獲sleep()方法可能丟擲的異常  

  11.         } catch (InterruptedException e) {  

  12.             e.printStackTrace();  

  13.         }  

  14.     }  

  15. }  

  16. class XkThread implements Runnable {  

  17.     private Thread th;  

  18.   

  19.     public XkThread() {  

  20.         th=new Thread(this);  

  21.         System.out.println("開始呼叫run()方法");  

  22.         th.start();//呼叫run()方法  

  23.     }  

  24.     @Override  

  25.     public void run() {  

  26.         try {  

  27.             for(int i=1;i

  28.                 th.sleep(1000);//讓執行緒睡眠1秒      

  29.                 System.out.println("大家好,我是子執行緒:"+i);  

  30.             }  

  31.             //需要捕獲sleep()方法可能丟擲的異常  

  32.         } catch (InterruptedException e) {  

  33.             e.printStackTrace();  

  34.         }  

  35.           

  36.     }  

  37.       

  38. }  

在NewThread中建構函式中,新的Thread物件由下面語句建立:

  1. th=new Thread(this);  

透過前面的語句this表明了在this物件中你想要新的執行緒呼叫run()方法。然後start()被呼叫,以run()方法為開始啟動了執行緒的執行。這使子執行緒for迴圈開始執行。呼叫start()方法之後,NewThread的建構函式返回到main()。當主執行緒被恢復,主執行緒開始執行自己的for迴圈。兩個執行緒同時執行,共享CPU,直到它們的迴圈結束。

執行結果:

  1. 開始呼叫run()方法  

  2. 大家好,我是主執行緒:1  

  3. 大家好,我是子執行緒:1  

  4. 大家好,我是子執行緒:2  

  5. 大家好,我是主執行緒:2  

  6. 大家好,我是子執行緒:3  

  7. 大家好,我是主執行緒:3  

  8. //省略  

繼承Thread類

建立執行緒的另一個途徑就是繼承Thread類,然後建立子類的例項。當一個類繼承Thread類時,它必須重寫run()方法,這個run()方法時新執行緒的入口。它也必須呼叫start()方法來啟用新執行緒執行。

  1. public class Test2 {  

  2.   

  3.     public static void main(String[] args) {  

  4.         new MyThread("child Thread");  

  5.         System.out.println("開始執行主執行緒的for迴圈");  

  6.         try {  

  7.             for(int i=1;i

  8.                 Thread.currentThread().sleep(1000);//讓主執行緒睡眠1秒     

  9.                 System.out.println("大家好,我是主執行緒:"+i);  

  10.             }  

  11.             //需要捕獲sleep()方法可能丟擲的異常  

  12.         } catch (InterruptedException e) {  

  13.             e.printStackTrace();  

  14.         }  

  15.     }  

  16. }  

  17. class MyThread extends Thread{  

  18.   

  19.     public MyThread(String threadName) {  

  20.         super(threadName);  

  21.         System.out.println("開始呼叫start()方法");  

  22.         start();  

  23.     }  

  24.       

  25.     @Override  

  26.     public void run() {  

  27.         System.out.println("開始執行子執行緒的for迴圈");  

  28.         try {  

  29.             for(int i=1;i

  30.                 sleep(500);//讓子執行緒睡眠0.5秒   

  31.                 System.out.println("大家好,我是子執行緒:"+i);  

  32.             }  

  33.             //需要捕獲sleep()方法可能丟擲的異常  

  34.         } catch (InterruptedException e) {  

  35.             e.printStackTrace();  

  36.         }  

  37.     }  

  38.       

  39. }  

建立一個子執行緒MtThread,在建構函式中呼叫start()方法啟動子執行緒,然後主執行緒也繼續執行,為了讓主執行緒最後結束,在這裡我讓子執行緒睡眠時間為0.5秒,主執行緒睡眠時間為1秒,這樣子總可以讓主執行緒最後結束。

執行結果:

  1. 開始呼叫start()方法  

  2. 開始執行主執行緒的for迴圈  

  3. 開始執行子執行緒的for迴圈  

  4. 大家好,我是子執行緒:1  

  5. 大家好,我是子執行緒:2  

  6. 大家好,我是主執行緒:1  

  7. 大家好,我是子執行緒:3  

  8. 大家好,我是主執行緒:2  

  9. 大家好,我是子執行緒:4  

  10. 大家好,我是子執行緒:5  

  11. 大家好,我是主執行緒:3  

  12. 大家好,我是主執行緒:4  

  13. 大家好,我是主執行緒:5  

最後

到這裡,你一定很奇怪為什麼Java有兩種建立子執行緒的方法呢?哪一種更好呢?所有的問題都歸於一點,Thread類定義了多種方法可以被子類過載。對於所有的方法,唯一的必須重寫的是run()方法。而實現Runnable介面也只需要重寫run()方法。因此,如果你不過載Thread的其他方法,最好是實現Runnable介面。當然了,這得看個人習慣。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4798/viewspace-2802278/,如需轉載,請註明出處,否則將追究法律責任。

相關文章