在Java中怎樣實現多執行緒?Java執行緒的四種狀態
一、在java中怎樣實現多執行緒?
extends Thread
implement Runnable
方法一:繼承 Thread 類,覆蓋方法 run(),我們在建立的 Thread 類的子類中重寫 run() ,加入執行緒所要執行的程式碼即可。
下面是一個例子:
public class MyThread extends Thread { int count= 1, number; public MyThread(int num) { number = num; System.out.println ("建立執行緒 " + number); } public void run() { while(true) { System.out.println ("執行緒 " + number + ":計數 " + count); if(++count== 6) return; } } public static void main(String args[]) { for(int i = 0;i 〈 5; i++) new MyThread(i+1).start(); } } *上海尚學堂Java培訓shsxt.com
這種方法簡單明瞭,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程式必須繼承自 Applet 類),則無法再繼承 Thread 類,這時如果我們又不想建立一個新的類,應該怎麼辦呢?
我們不妨來探索一種新的方法:我們不建立Thread類的子類,而是直接使用它,那麼我們只能將我們的方法作為引數傳遞給 Thread 類的例項,有點類似回撥函式。但是 Java 沒有指標,我們只能傳遞一個包含這個方法的類的例項。
那麼如何限制這個類必須包含這一方法呢?當然是使用介面!(雖然抽象類也可滿足,但是需要繼承,而我們之所以要採用這種新方法,不就是為了避免繼承帶來的限制嗎?)
Java 提供了介面 java.lang.Runnable 來支援這種方法。
方法二:實現 Runnable 介面
Runnable介面只有一個方法run(),我們宣告自己的類實現Runnable介面並提供這一方法,將我們的執行緒程式碼寫入其中,就完成了這一部分的任務。但是Runnable介面並沒有任何對執行緒的支援,我們還必須建立Thread類的例項,這一點通過Thread類的建構函式 public Thread(Runnable target);來實現。下面是一個例子:
public class MyThread implements Runnable { int count= 1, number; public MyThread(int num) { number = num; System.out.println("建立執行緒 " + number); } public void run() { while(true) { System.out.println ("執行緒 " + number + ":計數 " + count); if(++count== 6) return; } } public static void main(String args[]) { for(int i = 0; i 〈 5;i++) new Thread(new MyThread(i+1)).start(); } } **上海尚學堂Java培訓shsxt.com
嚴格地說,建立Thread子類的例項也是可行的,但是必須注意的是,該子類必須沒有覆蓋 Thread 類的 run 方法,否則該執行緒執行的將是子類的 run 方法,而不是我們用以實現Runnable 介面的類的 run 方法,對此大家不妨試驗一下。
使用 Runnable 介面來實現多執行緒使得我們能夠在一個類中包容所有的程式碼,有利於封裝,它的缺點在於,我們只能使用一套程式碼,若想建立多個執行緒並使各個執行緒執行不同的程式碼,則仍必須額外建立類,如果這樣的話,在大多數情況下也許還不如直接用多個類分別繼承 Thread 來得緊湊。
綜上所述,兩種方法各有千秋,大家可以靈活運用。
下面讓我們一起來研究一下多執行緒使用中的一些問題。
二、執行緒的四種狀態
1. 新狀態:執行緒已被建立但尚未執行(start() 尚未被呼叫)。
2. 可執行狀態:執行緒可以執行,雖然不一定正在執行。CPU 時間隨時可能被分配給該執行緒,從而使得它執行。
3. 死亡狀態:正常情況下 run() 返回使得執行緒死亡。呼叫 stop()或 destroy() 亦有同樣效果,但是不被推薦,前者會產生異常,後者是強制終止,不會釋放鎖。
4. 阻塞狀態:執行緒不會被分配 CPU 時間,無法執行。
三、執行緒的優先順序
執行緒的優先順序代表該執行緒的重要程度,當有多個執行緒同時處於可執行狀態並等待獲得 CPU 時間時,執行緒排程系統根據各個執行緒的優先順序來決定給誰分配 CPU 時間,優先順序高的執行緒有更大的機會獲得 CPU 時間,優先順序低的執行緒也不是沒有機會,只是機會要小一些罷了。
關於Java執行緒就介紹到這,更多Java學習資料教程請點上海尚學堂java學習視訊