欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

知其然

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

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

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

public class PrimeGenerator extends Thread {

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

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

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

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

        number++;
    }
}

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

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

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

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

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

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

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

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

task.interrupt();


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

知其所以然

下面的是示例程序執(zhí)行的打印片段。我們從打印出的字符可以看出PrimeGenerator線(xiàn)程是如何打印輸出信息以及當(dāng)檢測(cè)到線(xiàn)程被中斷時(shí),如何中止其執(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有一個(gè)布爾型的熟悉,來(lái)表明線(xiàn)程是否被中斷。當(dāng)調(diào)用interrupt()方法時(shí),就是將其設(shè)置為true。而isInterrupted()方法則是返回該屬性的當(dāng)前值。

永無(wú)止境

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

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

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

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

拿來(lái)主義

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

小有所成

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

PrimeGenerator類(lèi)的完整代碼

復(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ù)是否為素?cái)?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類(lèi)的完整代碼

復(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)文章

  • Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼

    Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼

    這篇文章主要介紹了Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Java 開(kāi)發(fā)的幾個(gè)注意點(diǎn)總結(jié)

    Java 開(kāi)發(fā)的幾個(gè)注意點(diǎn)總結(jié)

    這篇文章主要介紹了Java開(kāi)發(fā)的幾個(gè)注意點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Spring IOC基于注解啟動(dòng)示例詳析

    Spring IOC基于注解啟動(dòng)示例詳析

    這篇文章主要給大家介紹了Spring IOC基于注解啟動(dòng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • java類(lèi)中serialVersionUID的作用及其使用

    java類(lèi)中serialVersionUID的作用及其使用

    這篇文章主要介紹了java類(lèi)中serialVersionUID的作用及其使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java多線(xiàn)程用法的實(shí)例詳解

    Java多線(xiàn)程用法的實(shí)例詳解

    這篇文章主要介紹了Java多線(xiàn)程用法的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能夠理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • Spring Security和Shiro的相同點(diǎn)與不同點(diǎn)整理

    Spring Security和Shiro的相同點(diǎn)與不同點(diǎn)整理

    在本篇文章里小編給大家整理的是關(guān)于Spring Security和Shiro的相同不同點(diǎn)整理,需要的朋友們可以參考下。
    2020-02-02
  • Java實(shí)現(xiàn)無(wú)頭雙向鏈表操作

    Java實(shí)現(xiàn)無(wú)頭雙向鏈表操作

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)無(wú)頭雙向鏈表的基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringBoot整合MongoDB流程詳解

    SpringBoot整合MongoDB流程詳解

    這篇文章主要介紹了SpringBoot整合MongoDB流程詳解,MongoDB是一種面向文檔的數(shù)據(jù)庫(kù)管理系統(tǒng),它是一個(gè)介于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)之間的產(chǎn)品,MongoDB支持一種類(lèi)似JSON的BSON數(shù)據(jù)格式,既可以存儲(chǔ)簡(jiǎn)單的數(shù)據(jù)格式,也可以存儲(chǔ)復(fù)雜的數(shù)據(jù)類(lèi)型,需要的朋友可以參考下
    2024-01-01
  • Springboot整合MongoDB的Docker開(kāi)發(fā)教程全解

    Springboot整合MongoDB的Docker開(kāi)發(fā)教程全解

    這篇文章主要介紹了Springboot整合MongoDB的Docker開(kāi)發(fā),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2020-07-07
  • Java魔法堂之調(diào)用外部程序的方法

    Java魔法堂之調(diào)用外部程序的方法

    這篇文章主要介紹了Java魔法堂:調(diào)用外部程序的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-02-02

最新評(píng)論