最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年12月05日 09:55:12   投稿:junjie  
這篇文章主要介紹了Java并發(fā)編程示例(三):線程中斷,在本節(jié),我們所開發(fā)的示例程序?qū)?chuàng)建一個線程,五秒鐘后,利用中斷機(jī)制強(qiáng)制中止這個線程,需要的朋友可以參考下

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

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

在本節(jié),我們所開發(fā)的示例程序?qū)?chuàng)建一個線程,五秒鐘后,利用中斷機(jī)制強(qiáng)制中止這個線程。

知其然

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

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

復(fù)制代碼 代碼如下:

public class PrimeGenerator extends Thread {

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

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

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

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

        number++;
    }
}

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

復(fù)制代碼 代碼如下:

/**
 * 判斷參數(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)在,實(shí)現(xiàn)示例程序的主類,Main類,同時實(shí)現(xiàn)main()方法。代碼如下:
復(fù)制代碼 代碼如下:

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

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

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

7.等待五秒鐘,然后中止該線程。代碼如下:
復(fù)制代碼 代碼如下:

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

task.interrupt();


8.運(yùn)行該示例,查看結(jié)果。

知其所以然

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

復(fù)制代碼 代碼如下:

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有一個布爾型的熟悉,來表明線程是否被中斷。當(dāng)調(diào)用interrupt()方法時,就是將其設(shè)置為true。而isInterrupted()方法則是返回該屬性的當(dāng)前值。

永無止境

Thread還有一個可以檢查線程是否中斷的方法:即靜態(tài)方法interrupted(),可以檢查當(dāng)前正在執(zhí)行的線程是否被中斷。

復(fù)制代碼 代碼如下:

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

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

拿來主義

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

小有所成

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

PrimeGenerator類的完整代碼

復(fù)制代碼 代碼如下:

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類的完整代碼

復(fù)制代碼 代碼如下:

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();
    }
}

相關(guān)文章

  • SpringBoot排除不需要的自動配置類DataSourceAutoConfiguration問題

    SpringBoot排除不需要的自動配置類DataSourceAutoConfiguration問題

    這篇文章主要介紹了SpringBoot排除不需要的自動配置類DataSourceAutoConfiguration問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java 變量類型及其實(shí)例

    Java 變量類型及其實(shí)例

    這篇文章主要講解Java中變量的類型以及實(shí)例,希望能給大家做一個參考
    2017-04-04
  • Springboot處理配置CORS跨域請求時碰到的坑

    Springboot處理配置CORS跨域請求時碰到的坑

    本篇文章介紹了我在開發(fā)過程中遇到的一個問題,以及解決該問題的過程及思路,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • 分析JVM的組成結(jié)構(gòu)

    分析JVM的組成結(jié)構(gòu)

    JVM(虛擬機(jī)):指以軟件的方式模擬具有完整硬件系統(tǒng)功能、運(yùn)行在一個完全隔離環(huán)境中的完整計算機(jī)系統(tǒng) ,是物理機(jī)的軟件實(shí)現(xiàn)。JVM和VMware,Virtual Box等虛擬機(jī)一樣,都是運(yùn)行在操作系統(tǒng)之上的計算機(jī)系統(tǒng)
    2021-06-06
  • JAVA中單元測試的常用方式(小結(jié))

    JAVA中單元測試的常用方式(小結(jié))

    這篇文章主要介紹了JAVA中單元測試的常用方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題

    關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題

    這篇文章主要介紹了關(guān)于Java繼承中父類和子類構(gòu)造函數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Springmvc數(shù)據(jù)回顯實(shí)現(xiàn)原理實(shí)例解析

    Springmvc數(shù)據(jù)回顯實(shí)現(xiàn)原理實(shí)例解析

    這篇文章主要介紹了Springmvc數(shù)據(jù)回顯實(shí)現(xiàn)原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 簡單易懂的java8新特性之lambda表達(dá)式知識總結(jié)

    簡單易懂的java8新特性之lambda表達(dá)式知識總結(jié)

    一直想針對lambda表達(dá)式作一個總結(jié),借助于這次公司安排的考試作一個入門式的總結(jié),對正在學(xué)習(xí)java的小伙伴們非常有幫助,需要的朋友可以參考下
    2021-05-05
  • Java獲取登錄用戶的IP地址示例代碼

    Java獲取登錄用戶的IP地址示例代碼

    在開發(fā)中我們經(jīng)常需要獲取用戶IP地址,通過地址來實(shí)現(xiàn)一些功能,下面這篇文章主要給大家介紹了關(guān)于Java獲取登錄用戶的IP地址的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 五分鐘教你手寫 SpringBoot 本地事務(wù)管理實(shí)現(xiàn)

    五分鐘教你手寫 SpringBoot 本地事務(wù)管理實(shí)現(xiàn)

    這篇文章主要介紹了五分鐘教你手寫 SpringBoot 本地事務(wù)管理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

栾城县| 明溪县| 文昌市| 阜宁县| 宣威市| 盐亭县| 鄯善县| 元江| 普陀区| 娱乐| 灵丘县| 阿尔山市| 钟祥市| 利川市| 鞍山市| 托克逊县| 镇坪县| 家居| 岑溪市| 光泽县| 灌南县| 小金县| 全州县| 本溪| 富顺县| 外汇| 灌南县| 马山县| 旬阳县| 定西市| 翁源县| 化德县| 海伦市| 玉环县| 旬阳县| 丰原市| 郧西县| 西华县| 两当县| 临洮县| 噶尔县|