一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java并發(fā)編程示例(三):線程中斷

Java并發(fā)編程示例(三):線程中斷

2019-12-06 14:06junjie JAVA教程

這篇文章主要介紹了Java并發(fā)編程示例(三):線程中斷,在本節(jié),我們所開發(fā)的示例程序將會創(chuàng)建一個線程,五秒鐘后,利用中斷機制強制中止這個線程,需要的朋友可以參考下

一個多線程的Java程序,直到所有線程執(zhí)行完成,整個程序才會退出。(需要注意的是,是所有非后臺線程(non-daemon thread)執(zhí)行完成;如果一個線程執(zhí)行了System.exit()方法,程序也會退出。)有時,你想中止一個線程的執(zhí)行,例如你想退出程序,或者你想取消一個正在執(zhí)行的任務等。

Java提供了中斷機制,可以讓我們顯式地中斷我們想中止執(zhí)行的線程。中斷機制的一個特征就是我們可以檢查線程是否已經(jīng)被中斷,進而決定是否響應中止請求。線程也可以忽略中止請求,繼續(xù)執(zhí)行。

在本節(jié),我們所開發(fā)的示例程序將會創(chuàng)建一個線程,五秒鐘后,利用中斷機制強制中止這個線程。

知其然

按照下面步驟所示,完成示例程序。

1.創(chuàng)建一個名為PrimeGenerator的類,并且繼承Thread類。代碼如下:

復制代碼代碼如下:

public class PrimeGenerator extends Thread {


2.重寫run()方法,在方法中添加一個無限循環(huán),在循環(huán)內,通過計算來檢查從1開始的連續(xù)正整數(shù)是否為素數(shù)。如果是,則打印到控制臺。代碼如下:

復制代碼代碼如下:

@Override
public void run() {
    long number = 1L;
    while (true) {
        if (isPrime(number)) {
            System.out.printf("Number %d \tis Prime.", number);
        }


3.在處理一個數(shù)字之后,通過調用isInterrupted()方法來檢查線程是否被中斷。如果該方法返回true,則向控制臺打印一句話,然后中止線程執(zhí)行。代碼如下:

復制代碼代碼如下:


        if (isInterrupted()) {
            System.out.println("The Prime Generator has been Interrupted");
            return;
        }

 

        number++;
    }
}

 

4.實現(xiàn)isPrime()方法,該方法用于判斷參數(shù)是否為素數(shù),如果是則返回true,否則返回false。代碼如下:

復制代碼代碼如下:


/**
 * 判斷參數(shù)是否為素數(shù)
 *
 * @param number 需要判斷的數(shù)字
 * @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.現(xiàn)在,實現(xiàn)示例程序的主類,Main類,同時實現(xiàn)main()方法。代碼如下:

復制代碼代碼如下:

public class Main {
    public static void main(String[] args) {


6.創(chuàng)建一個PrimeGenerator對象,并且啟動該線程。代碼如下:

復制代碼代碼如下:

Thread task = new PrimeGenerator();
task.start();


7.等待五秒鐘,然后中止該線程。代碼如下:

復制代碼代碼如下:


try {
    TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

task.interrupt();


8.運行該示例,查看結果。

 

知其所以然

下面的是示例程序執(zhí)行的打印片段。我們從打印出的字符可以看出PrimeGenerator線程是如何打印輸出信息以及當檢測到線程被中斷時,如何中止其執(zhí)行的。

復制代碼代碼如下:

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還有一個可以檢查線程是否中斷的方法:即靜態(tài)方法interrupted(),可以檢查當前正在執(zhí)行的線程是否被中斷。

 

復制代碼代碼如下:

isInterrupted()方法和interrupted()方法有非常大的不同。前者不會改變線程是否中斷的屬性值;而后者則可以將其值設置為false。interrupted()是一個靜態(tài)方法;平時開發(fā)推薦使用isInterrupted()方法。

 

正如前面所述,線程可以忽略中斷請求而繼續(xù)執(zhí)行。但是,這并不是我們想要的結果。

拿來主義

本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7并發(fā)示例集》 )翻譯而來,僅作為學習資料使用。沒有授權,不得用于任何商業(yè)行為。

小有所成

示例程序所用的所有代碼的完整版本。

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++;
        }
    }

    /**
     * 判斷參數(shù)是否為素數(shù)
     *
     * @param number 需要判斷的數(shù)字
     * @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();
    }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产91久久久久久麻豆 | 能免费观看的韩剧 | 大陆国产vs国产对白 | 色综合网天天综合色中文男男 | 高清国语自产拍免费视频国产 | 成版人快猫永久破解版 | 欧洲老太玩小伙 | 亚1洲二区三区四区免费 | 啾咪成人漫画免费 | 日韩一区二区三区不卡视频 | 男人操女人免费视频 | 国产欧美日韩成人 | 成人高清视频在线观看 | 亚洲成人中文 | 国产成人精品免费 | 日韩成本大片35分钟免费播放 | 精品国产一级毛片大全 | 夫妻性生活在线 | 2020年精品国产午夜福利在线 | 欧美日韩精彩视频 | h视频免费高清在线观看 | 日韩中文在线 | 亚洲成年男人的天堂网 | 大香焦在线观看 | 晓雪老师我要进你里面好爽 | 1024免费福利永久观看网站 | 97午夜视频 | 吉川爱美与黑人解禁 | 91成人免费观看 | 国产精品1024永久免费视频 | 青春草在线观看精品免费视频 | 亚洲精品成人a | 免费国产在线观看 | 羞羞答答免费人成黄页在线观看国产 | 91噜噜噜在线观看 | 四虎永久在线精品免费影视 | 女色在线观看免费视频 | 日产乱码卡一卡2卡三卡四福利 | 四虎成人免费大片在线 | 三上悠亚久久国产 | 日本福利片国产午夜久久 |