程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java並發編程示例(三):線程中止

Java並發編程示例(三):線程中止

編輯:關於JAVA

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved