2010年7月3日 星期六

Java 執行緒 - Thread

對於 JAVA 的多執行緒方面,基本項目上都不難理解,執行緒的基本名詞解釋幾介紹在書上一定都會有詳細的說明,但還是要透過一些簡單的程式理解。

而執行緒的應用也相當廣泛,譬如在網路程式、IO處理、GUI、多個用戶端的服務等

首先 JAVA 的執行續有兩種啟動的方法:
1.繼承 Thread 類別並呼叫 run 方法
2.實作 Runnable 介面並呼叫 run 方法



先看第一種方法,如下:
首先先建立一個類別並繼承 Thread,在呼叫 run 方法

class MyThread extends Thread //繼承 Thread
{
public void run(){ //run 方法 就是執行續執行的地方
for(int i=0;i<10;i++){system.out.print(i);}
}
}

接下來在你的主類別裡:
public static void main(String[] args)
{
new MyThread().start();
//建立 MyThread 的實體後呼叫 start 方法,這時會啟動一個新的執行緒並去呼叫該實體的 run 方法!!
}

接下來看第二種方法,如下:

class MyThread implements Runnable //宣告類別並實作 Runnable 介面
{
public void run(){ //同上
for(int i=0;i<10;i++){system.out.print(i);}
}
}

之後在你的主類別裡:
.....
new Thread(new MyThread()).start();
//建立 Thread 類別實體將實作 Runnable 介面的類別傳入當作參數,再利用 start() 啟動
.....

/** 補充觀念 **/

打個比方說明執行緒的一些觀念 (這些在書上都會有的)
如果你有一個程式 成立了 10 個執行緒,然後一一呼叫 start 方法啟動該執行緒,這裡只是 JVM 會將該條執行緒丟入就緒池中,並隨機挑選執行池裡的執行去出來執行,所以並不是先 start 就會先執行,但可透過 setPriority() 來設定該執行緒的優先權,以提高該執行緒先進入執行的機會但也並不是代表優先權越最高的一定會先執行。
再來就是每個執行緒從被選入並開始執行到結束被踢出的這段時間並不是你可以控制的,也就是說假如現在有兩個執行緒 A和 B,當A執行緒執行完了它的 CPU time就會被踢出來換成B執行續執行,待B執行緒的 CPU time 結束才會換A執行緒。

/** 補充觀念 **/

/** 補充說明 **/

Thread 類別本身也是有實做 Runnable 介面的,也有 run 方法,只不過 run 方法的主體是空的
所以通常都是透過子類別的繼承覆載,而 Runnable 介面的 run 方法宣告如下:
public abstract void run();
所以既然實做了此介面了你就必須實做該方法

/** 補充說明 **/

Java 執行緒的時間暫停(sleep),如下:
try{
Thread.sleep(1000);
}catch(InterruptedException e){}
利用 Thread 類別的 sleep 方法即可暫停目前正在執行的的執行緒的動作
注意傳入的整入代表的是毫秒也就是說上述是讓執行緒睡了一秒
並且在呼叫 sleep 方法時一定會丟出 InterruptedException 例外,記得處理。


以上就是 Java 執行緒最最最基本的東西,只要記得啟動執行緒的兩種方法,並將執行緒要執行的事情放在 run 方法裡面即可
進階一點的執行續處理可以看
Java 執行緒教學(二)