1. 程式人生 > >執行緒管理(三)執行緒的中斷

執行緒管理(三)執行緒的中斷

宣告:本文是《 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 執行緒是如何檢測到它被中斷了然後寫了資訊並結束執行的。 請看截圖:

1-3

Thread 類還有一個boolean型別的屬性來表明執行緒是否被中斷。當你呼叫執行緒的interrupt() 方法,就代表你把這個屬性設定為 true。 而isInterrupted() 方法僅返回屬性值。

更多

Thread 類還有其他可以檢查執行緒是否被中斷的方法。例如,這個靜態方法interrupted()能檢查正在執行的執行緒是否被中斷。

isInterrupted()和interrupted() 方法有著很重要的區別。

第一個不會改變interrupted屬性值,但是第二個會設定成false。

interrupted() 方法是一個靜態方法,建議使用isInterrupted()方法。

在之前提到的,執行緒是可以忽略中斷指令的,但是並這不是我們所期望的行為。