Java並發編程示例(三):線程中止。本站提示廣大學習愛好者:(Java並發編程示例(三):線程中止)文章只能為提供參考,不一定能成為您想要的結果。以下是Java並發編程示例(三):線程中止正文
一個多線程的Java法式,直到一切線程履行完成,全部法式才會加入。(須要留意的是,是一切非後台線程(non-daemon thread)履行完成;假如一個線程履行了System.exit()辦法,法式也會加入。)有時,你想中斷一個線程的履行,例如你想加入法式,或許你想撤消一個正在履行的義務等。
Java供給了中止機制,可讓我們顯式地中止我們想中斷履行的線程。中止機制的一個特點就是我們可以檢討線程能否曾經被中止,進而決議能否呼應中斷要求。線程也能夠疏忽中斷要求,持續履行。
在本節,我們所開辟的示例法式將會創立一個線程,五秒鐘後,應用中止機制強迫中斷這個線程。
知其然
依照上面步調所示,完成示例法式。
1.創立一個名為PrimeGenerator的類,而且繼續Thread類。代碼以下:
public class PrimeGenerator extends Thread {
2.重寫run()辦法,在辦法中添加一個無窮輪回,在輪回內,經由過程盤算來檢討從1開端的持續正整數能否為素數。假如是,則打印到掌握台。代碼以下:
@Override
public void run() {
long number = 1L;
while (true) {
if (isPrime(number)) {
System.out.printf("Number %d \tis Prime.", number);
}
3.在處置一個數字以後,經由過程挪用isInterrupted()辦法來檢討線程能否被中止。假如該辦法前往true,則向掌握台打印一句話,然後中斷線程履行。代碼以下:
if (isInterrupted()) {
System.out.println("The Prime Generator has been Interrupted");
return;
}
number++;
}
}
4.完成isPrime()辦法,該辦法用於斷定參數能否為素數,假如是則前往true,不然前往false。代碼以下:
/**
* 斷定參數能否為素數
*
* @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;
}
5.如今,完成示例法式的主類,Main類,同時完成main()辦法。代碼以下:
public class Main {
public static void main(String[] args) {
6.創立一個PrimeGenerator對象,而且啟動該線程。代碼以下:
Thread task = new PrimeGenerator();
task.start();
7.期待五秒鐘,然後中斷該線程。代碼以下:
try {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
8.運轉該示例,檢查成果。
知其所以然
上面的是示例法式履行的打印片斷。我們從打印出的字符可以看出PrimeGenerator線程是若何打印輸入信息和當檢測到線程被中止時,若何中斷其履行的。
Number 43063 is Prime.
Number 43067 is Prime.
Number 43093 is Prime.
Number 43103 is Prime.
Number 43117 is Prime.
The Prime Generator has been Interrupted
Thread有一個布爾型的熟習,來注解線程能否被中止。當挪用interrupt()辦法時,就是將其設置為true。而isInterrupted()辦法則是前往該屬性確當前值。
永無盡頭
Thread還有一個可以檢討線程能否中止的辦法:即靜態辦法interrupted(),可以檢討以後正在履行的線程能否被中止。
isInterrupted()辦法和interrupted()辦法有異常年夜的分歧。前者不會轉變線程能否中止的屬性值;爾後者則可以將其值設置為false。interrupted()是一個靜態辦法;日常平凡開辟推舉應用isInterrupted()辦法。
正如後面所述,線程可以疏忽中止要求而持續履行。然則,這其實不是我們想要的成果。
拿來主義
本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7並發示例集》 )翻譯而來,僅作為進修材料應用。沒有受權,不得用於任何貿易行動。
小有所成
示例法式所用的一切代碼的完全版本。
PrimeGenerator類的完全代碼
package com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* 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類的完全代碼
package com.diguage.books.concurrencycookbook.chapter1.recipe3;
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();
}
}