亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java并發編程示例(四):可控的線程中斷

2019-11-26 15:20:37
字體:
來源:轉載
供稿:網友

在上一節“線程中斷”中,我們講解了如何中斷一個正在執行的線程以及為了中斷線程,我們必須對Thread動點什么手腳。一般情況下,我們可以使用上一節介紹的中斷機制。但是,如果線程實現了一個分配到多個方法中的復雜算法,或者方法調用中有一個遞歸調用,我們應該使用更好的方式來控制線程的中斷。為此,Java提供了InterruptedException異常。當檢測到中斷請求時,可以拋出此異常,并且在run()方法中捕獲。

在本節,我們將使用一個線程查找指定目錄及其子目錄下文件來演示通過使用InterruptedException異??刂凭€程中斷。

知其然

按照下面所示步驟,實現示例程序。

1.創建一個名為FileSearch的類,并且實現Runnable接口。代碼如下:

復制代碼 代碼如下:

public class FileSearch implements Runnable {

2.聲明兩個變量,一個用于需要查找的文件名,一個用于初始化查找的目錄;實現類的構造函數,并用構造函數的參數初始化剛剛聲明的兩個變量。代碼如下:

復制代碼 代碼如下:

private String initPath;
private String fileName;

public FileSearch(String initPath, String fileName) {
    this.initPath = initPath;
    this.fileName = fileName;
}

3.實現run()方法,該方法檢查fileName是否一個路徑名稱。如果是,則調用directoryProcess()方法進行處理。directoryProcess()方法會拋出InterruptedException異常,所以我們需要捕獲該異常。代碼如下:

復制代碼 代碼如下:

@Override
public void run() {
    File file = new File(initPath);
    if (file.isDirectory()) {
        try {
            directoryProcess(file);
        } catch (InterruptedException e) {
            System.out.printf("%s: The search has been interrupted",
                    Thread.currentThread().getName());
        }
    }
}

原文中,提到的方法名稱為processDirectory()。但是,根據下文的程序,屬于筆誤。故改正。

4.實現directoryProcess()方法。該方法讀取指定目錄下的所有文件以及子目錄再進行處理。對于每一個目錄,該方法進行一個遞歸調用,來處理參數指定的目錄。對于每一個文件,該方法會調用fileProcess()方法。在處理完所有的目錄以及文件后,該方法會檢查線程是否被中斷,這是拋出一個InterruptedException異常。代碼如下:

復制代碼 代碼如下:

/**
 * 處理一個目錄
 *
 * @param file 需要處理的目錄
 * @throws InterruptedException
 */
private void directoryProcess(File file) throws InterruptedException {
    File[] list = file.listFiles();
    if (null != list) {
        for (int i = 0; i < list.length; i++) {
            if (list[i].isDirectory()) {
                directoryProcess(list[i]);
            } else {
                fileProcess(list[i]);
            }

        }
    }
    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
}

5.實現fileProcess()方法,該方法會比較正在處理的文件和需要查找的文件名。如果文件名稱相等,則在控制臺打印出一條信息。然后,線程檢查是否被中斷,如果是,則拋出InterruptedException異常。代碼如下:

復制代碼 代碼如下:

/**
 * 處理的文件
 *
 * @param file 需要處理的文件
 * @throws InterruptedException
 */
private void fileProcess(File file) throws InterruptedException {
    if (file.getName().equals(fileName)) {
        System.out.printf("%s : %s/n",
                Thread.currentThread().getName(),
                file.getAbsolutePath());
    }

    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
}


6.現在,來實現示例的主類,并且實現main()方法。代碼如下:
復制代碼 代碼如下:

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

7.創建并初始化FileSearch對象,然后創建一個Thread對象,來執行該任務。然后,啟動該線程。代碼如下:
復制代碼 代碼如下:

FileSearch fileSearch = new FileSearch("C://", "autoexec.bat");
Thread thread = new Thread(fileSearch);
thread.start();

8.等待十秒鐘,然后中斷線程。代碼如下:

復制代碼 代碼如下:

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

thread.interrupt();

9.執行該示例,查看結果。

知其所以然

下面是線程執行的結果。從輸出中可以看出,當FileSearch檢測到被中斷后,如何中止線程執行的。

復制代碼 代碼如下:

Thread-0 : C:/autoexec.bat
Thread-0: The search has been interrupted

本示例中,我們使用Java的異常來控制線程的中斷。當你運行示例時,程序會檢測指定目錄及其子目錄是否包含目標文件。例如,如果輸入/b/c/d,程序將會遞歸調用三次directoryProcess()方法。當線程檢測到其被中斷,則會拋出InterruptedException異常,無論執行多少次遞歸調用,程序都會開始執行run()方法。

永無止境

InterruptedException異常一般由Java并發API,例如sleep()方法,拋出。

拿來主義

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

小有所成

FileSearch類的完整代碼

復制代碼 代碼如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe4;

import java.io.File;

/**
 * Date: 2013-09-18
 * Time: 18:21
 */
public class FileSearch implements Runnable {
    private String initPath;
    private String fileName;

    /**
     * 初始化構造函數
     *
     * @param initPath 需要進行查找的目錄
     * @param fileName 需要查找的文件名稱
     */
    public FileSearch(String initPath, String fileName) {
        this.initPath = initPath;
        this.fileName = fileName;
    }

    @Override
    public void run() {
        File file = new File(initPath);
        if (file.isDirectory()) {
            try {
                directoryProcess(file);
            } catch (InterruptedException e) {
                System.out.printf("%s: The search has been interrupted",
                        Thread.currentThread().getName());
            }
        }
    }

    /**
     * 處理一個目錄
     *
     * @param file 需要處理的目錄
     * @throws InterruptedException
     */
    private void directoryProcess(File file) throws InterruptedException {
        File[] list = file.listFiles();
        if (null != list) {
            for (int i = 0; i < list.length; i++) {
                if (list[i].isDirectory()) {
                    directoryProcess(list[i]);
                } else {
                    fileProcess(list[i]);
                }

            }
        }
        if (Thread.interrupted()) {
            throw new InterruptedException();
        }
    }

    /**
     * 處理的文件
     *
     * @param file 需要處理的文件
     * @throws InterruptedException
     */
    private void fileProcess(File file) throws InterruptedException {
        if (file.getName().equals(fileName)) {
            System.out.printf("%s : %s/n",
                    Thread.currentThread().getName(),
                    file.getAbsolutePath());
        }

        if (Thread.interrupted()) {
            throw new InterruptedException();
        }
    }
}

Main類的完整代碼

復制代碼 代碼如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe4;

import java.util.concurrent.TimeUnit;

/**
 * Date: 2013-09-18
 * Time: 19:28
 */
public class Main {
    public static void main(String[] args) {
        FileSearch fileSearch = new FileSearch("C://", "autoexec.bat");
        Thread thread = new Thread(fileSearch);
        thread.start();

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

        thread.interrupt();
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人a视频在线观看| 久久6精品影院| 国产欧美精品在线| 日韩人体视频一二区| 97视频在线观看免费| 亚洲国产精品电影| 亚洲电影在线看| 亚洲人精选亚洲人成在线| 欧美日韩亚洲一区二区三区| 欧美国产日韩一区| 久久久久久午夜| 日韩欧美在线观看视频| 中文字幕亚洲综合久久筱田步美| 亚洲精品一区久久久久久| 国产精品爽黄69天堂a| 亚洲最大成人在线| 中文字幕日韩专区| 成人免费在线视频网站| 国产精品日韩在线播放| 992tv在线成人免费观看| 国产精品99久久久久久人| 日产精品久久久一区二区福利| 51久久精品夜色国产麻豆| 欧美精品激情在线| 91精品国产高清久久久久久| 国产精品入口夜色视频大尺度| 国产91在线播放精品91| 日本精品视频在线观看| 51ⅴ精品国产91久久久久久| 久久不射热爱视频精品| 日韩av中文字幕在线| 精品一区二区三区三区| 色中色综合影院手机版在线观看| 亚洲精品日韩久久久| 亚洲女成人图区| 国产精品∨欧美精品v日韩精品| 亚洲老头同性xxxxx| 欧美日韩福利电影| 国产成+人+综合+亚洲欧洲| 国产精品男女猛烈高潮激情| 欧美在线影院在线视频| 78m国产成人精品视频| 日韩精品在线免费播放| 成人欧美一区二区三区黑人孕妇| 亚洲另类图片色| 亚洲精品国产拍免费91在线| 欧美精品激情在线| 国产不卡av在线| 欧美午夜片在线免费观看| 97在线观看视频国产| 国产网站欧美日韩免费精品在线观看| 国产日韩精品在线播放| 91tv亚洲精品香蕉国产一区7ujn| 国产精品久久久久久中文字| 欧美一级淫片播放口| 97精品免费视频| 色爱av美腿丝袜综合粉嫩av| 欧美在线一级va免费观看| 日韩在线一区二区三区免费视频| 97精品视频在线播放| 成人黄色生活片| 日韩美女av在线免费观看| 欧美在线国产精品| 色综合久久88| 亚洲成人av中文字幕| 久久久精品国产一区二区| 亚洲综合自拍一区| 国产在线观看精品| 亚洲精品久久久久中文字幕欢迎你| 亚洲午夜色婷婷在线| 日韩欧美aaa| 欧美性色xo影院| 91免费在线视频| 国产欧美最新羞羞视频在线观看| 国产婷婷成人久久av免费高清| 精品久久久999| 欧美中文字幕在线观看| 国产精品激情av电影在线观看| 亚洲成人av在线| 免费av一区二区| 91网在线免费观看| 亚洲丝袜av一区| 日韩在线一区二区三区免费视频| 成人中文字幕在线观看| 国产精品一二三在线| 日韩人体视频一二区| 欧美国产日韩免费| 91社区国产高清| 国产精品久在线观看| 欧美成人午夜剧场免费观看| 国产精品电影久久久久电影网| 亚洲精品久久久一区二区三区| 亚洲美女福利视频网站| 这里只有精品久久| 亚洲一区二区国产| 国产精品18久久久久久麻辣| 亚洲国产精品悠悠久久琪琪| 欧美日韩国产一区二区三区| 久久免费在线观看| 亚洲国产精品视频在线观看| 欧美日韩高清区| 亚洲毛片在线观看.| 国产欧美日韩中文字幕| 91精品久久久久久久| 高清欧美一区二区三区| 日本19禁啪啪免费观看www| 国产精品久久久久高潮| 久久精品国产一区二区电影| 欧美日韩精品在线视频| 亚洲精品二三区| 欧美日韩亚洲视频一区| 91精品国产综合久久久久久久久| 影音先锋日韩有码| 中文字幕视频在线免费欧美日韩综合在线看| 欧美在线www| 欧美一级片一区| 久久夜色精品国产欧美乱| 青草热久免费精品视频| 欧美亚洲另类制服自拍| 久久久亚洲成人| 青青草国产精品一区二区| 91精品久久久久久综合乱菊| 国产欧美日韩中文字幕| 欧美性xxxxhd| 俺去亚洲欧洲欧美日韩| 久久露脸国产精品| 91中文在线观看| 日韩av在线电影网| 国产成人亚洲综合91| 亚洲福利视频免费观看| 国产精品黄页免费高清在线观看| 久久夜色精品国产欧美乱| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲一区二区三区乱码aⅴ| 日韩av在线一区| 欧美成人激情图片网| 亚洲国产精久久久久久| 国产欧美精品xxxx另类| 亚洲国产成人久久综合一区| 精品露脸国产偷人在视频| 不卡av日日日| 亚洲成人精品久久久| 欧美性猛交xxxx富婆弯腰| 日韩美女激情视频| 欧美另类xxx| 日韩av在线网页| 久久免费观看视频| 欧美性猛交xxxx乱大交蜜桃| 裸体女人亚洲精品一区| 欧美视频专区一二在线观看| 久久久久国产精品www| 欧美电影在线观看完整版| 国产精品高清在线观看| 国产美女扒开尿口久久久| 亚洲一区二区三区四区视频| 国语自产精品视频在线看| 欧美一区在线直播| 狠狠操狠狠色综合网| 国产亚洲一区二区精品| 欧美激情一二区| 国产美女主播一区| 欧美亚洲另类激情另类| 91在线国产电影| 国产精品久久久999|