一個多線程的Java程序,直到所有線程執行完成,整個程序才會退出。(需要注意的是,是所有非后臺線程(non-daemon thread)執行完成;如果一個線程執行了System.exit()方法,程序也會退出。)有時,你想中止一個線程的執行,例如你想退出程序,或者你想取消一個正在執行的任務等。
Java提供了中斷機制,可以讓我們顯式地中斷我們想中止執行的線程。中斷機制的一個特征就是我們可以檢查線程是否已經被中斷,進而決定是否響應中止請求。線程也可以忽略中止請求,繼續執行。
在本節,我們所開發的示例程序將會創建一個線程,五秒鐘后,利用中斷機制強制中止這個線程。
知其然
按照下面步驟所示,完成示例程序。
1.創建一個名為PrimeGenerator的類,并且繼承Thread類。代碼如下:
number++;
}
}
4.實現isPrime()方法,該方法用于判斷參數是否為素數,如果是則返回true,否則返回false。代碼如下:
for (int i = 2; i < number; i++) {
if ((number % i) == 0) {
return false;
}
}
return true;
}
task.interrupt();
知其所以然
下面的是示例程序執行的打印片段。我們從打印出的字符可以看出PrimeGenerator線程是如何打印輸出信息以及當檢測到線程被中斷時,如何中止其執行的。
Thread有一個布爾型的熟悉,來表明線程是否被中斷。當調用interrupt()方法時,就是將其設置為true。而isInterrupted()方法則是返回該屬性的當前值。
永無止境
Thread還有一個可以檢查線程是否中斷的方法:即靜態方法interrupted(),可以檢查當前正在執行的線程是否被中斷。
正如前面所述,線程可以忽略中斷請求而繼續執行。但是,這并不是我們想要的結果。
拿來主義
本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7并發示例集》 )翻譯而來,僅作為學習資料使用。沒有授權,不得用于任何商業行為。
小有所成
示例程序所用的所有代碼的完整版本。
PrimeGenerator類的完整代碼
/**
* Date: 2013-09-18
* Time: 11:53
*/
public class PrimeGenerator extends Thread {
@Override
public void run() {
long number = 1L;
while (true) {
if (isPrime(number)) {
System.out.printf("Number %d /tis Prime./n", number);
}
if (isInterrupted()) {
System.out.println("The Prime Generator has been Interrupted");
return;
}
number++;
}
}
/**
* 判斷參數是否為素數
*
* @param number 需要判斷的數字
* @return
*/
private boolean isPrime(long number) {
if (number <= 2) {
return true;
}
for (int i = 2; i < number; i++) {
if ((number % i) == 0) {
return false;
}
}
return true;
}
}
Main類的完整代碼
import java.util.concurrent.TimeUnit;
/**
* Date: 2013-09-18
* Time: 12:33
*/
public class Main {
public static void main(String[] args) {
Thread task = new PrimeGenerator();
task.start();
try {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
}
}
新聞熱點
疑難解答