執行緒管理(三)執行緒的中斷
宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 校對:歐振聰
執行緒的中斷
一個多個執行緒在執行的Java程式,只有當其全部的執行緒執行結束時(更具體的說,是所有非守護執行緒結束或者某個執行緒呼叫System.exit()方法的時候),它才會結束執行。有時,你需要為了終止程式而結束一個執行緒,或者當程式的使用者想要取消某個Thread物件正在做的任務。
Java提供中斷機制來通知執行緒表明我們想要結束它。中斷機制的特性是執行緒需要檢查是否被中斷,而且還可以決定是否響應結束的請求。所以,執行緒可以忽略中斷請求並且繼續執行。
在這個指南中, 我們將開發一個程式,它建立執行緒,然後在5秒之後,它會使用中斷機制來強制結束執行緒。
準備
指南中的例子是使用Eclipse IDE 來實現的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 開啟並建立一個新的java專案。
怎麼做呢…
按照這些步驟來實現下面的例子::
1. 建立一個名為PrimeGenerator的類,擴充套件Thread類。
public class PrimeGenerator extends Thread{
2. 覆蓋 run()方法,寫一個無限迴圈的while迴圈。在迴圈裡,我們將從1開始處理連續的數字。對於每個數字,如果它是質數,那麼,我們就把它寫入到操控臺。
@Override public void run() { long number=1L; while (true) { if (isPrime(number)) { System.out.printf("Number %d is Prime",number); }
3. 處理完一個數字, 呼叫isInterrupted()方法來檢查執行緒是否被中斷了。如果它返回值為真,就寫一個資訊並結束執行緒的執行。
if (isInterrupted()) { System.out.printf("The Prime Generator has been Interrupted"); return; } number++; } }
4. 實現isPrime()方法. 它返回 boolean 值表明接收到的數字是否是質數。
private boolean isPrime(long number) { if (number <=2) { return true; } for (long i=2; i<number; i++){ if ((number % i)==0) { return false; } } return true; }
5. 現在, 實現一個名為Main的類,包括實現main()方法來實現例子的Mian類。
public class Main { public static void main(String[] args) {
6. 建立並開始一個PrimeGenerator類的物件。
Thread task=new PrimeGenerator(); task.start();
7. 等待5秒,然後中斷 PrimeGenerator 方法。
try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } task.interrupt();
8. 執行並檢視結果。
它是如果工作的…
下面是以上例子的執行結果這截圖。我們可以發現 PrimeGenerator 執行緒是如何檢測到它被中斷了然後寫了資訊並結束執行的。 請看截圖:
Thread 類還有一個boolean型別的屬性來表明執行緒是否被中斷。當你呼叫執行緒的interrupt() 方法,就代表你把這個屬性設定為 true。 而isInterrupted() 方法僅返回屬性值。
更多…
Thread 類還有其他可以檢查執行緒是否被中斷的方法。例如,這個靜態方法interrupted()能檢查正在執行的執行緒是否被中斷。
isInterrupted()和interrupted() 方法有著很重要的區別。
第一個不會改變interrupted屬性值,但是第二個會設定成false。
interrupted() 方法是一個靜態方法,建議使用isInterrupted()方法。
在之前提到的,執行緒是可以忽略中斷指令的,但是並這不是我們所期望的行為。