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

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

 更新時間:2014年12月05日 10:05:52   投稿:junjie  
這篇文章主要介紹了Java并發(fā)編程示例(四):可控的線程中斷,在本節(jié),我們將使用一個線程查找指定目錄及其子目錄下文件來演示通過使用InterruptedException異常控制線程中斷,需要的朋友可以參考下

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

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

知其然

按照下面所示步驟,實(shí)現(xiàn)示例程序。

1.創(chuàng)建一個名為FileSearch的類,并且實(shí)現(xiàn)Runnable接口。代碼如下:

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

public class FileSearch implements Runnable {

2.聲明兩個變量,一個用于需要查找的文件名,一個用于初始化查找的目錄;實(shí)現(xiàn)類的構(gòu)造函數(shù),并用構(gòu)造函數(shù)的參數(shù)初始化剛剛聲明的兩個變量。代碼如下:

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

private String initPath;
private String fileName;

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

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

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

@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()。但是,根據(jù)下文的程序,屬于筆誤。故改正。

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

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

/**
 * 處理一個目錄
 *
 * @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.實(shí)現(xiàn)fileProcess()方法,該方法會比較正在處理的文件和需要查找的文件名。如果文件名稱相等,則在控制臺打印出一條信息。然后,線程檢查是否被中斷,如果是,則拋出InterruptedException異常。代碼如下:

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

/**
 * 處理的文件
 *
 * @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.現(xiàn)在,來實(shí)現(xiàn)示例的主類,并且實(shí)現(xiàn)main()方法。代碼如下:
復(fù)制代碼 代碼如下:

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

7.創(chuàng)建并初始化FileSearch對象,然后創(chuàng)建一個Thread對象,來執(zhí)行該任務(wù)。然后,啟動該線程。代碼如下:
復(fù)制代碼 代碼如下:

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

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

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

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

thread.interrupt();

9.執(zhí)行該示例,查看結(jié)果。

知其所以然

下面是線程執(zhí)行的結(jié)果。從輸出中可以看出,當(dāng)FileSearch檢測到被中斷后,如何中止線程執(zhí)行的。

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

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

本示例中,我們使用Java的異常來控制線程的中斷。當(dāng)你運(yùn)行示例時,程序會檢測指定目錄及其子目錄是否包含目標(biāo)文件。例如,如果輸入\b\c\d,程序?qū)f歸調(diào)用三次directoryProcess()方法。當(dāng)線程檢測到其被中斷,則會拋出InterruptedException異常,無論執(zhí)行多少次遞歸調(diào)用,程序都會開始執(zhí)行run()方法。

永無止境

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

拿來主義

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

小有所成

FileSearch類的完整代碼

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

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;

    /**
     * 初始化構(gòu)造函數(shù)
     *
     * @param initPath 需要進(jìn)行查找的目錄
     * @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類的完整代碼

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

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

相關(guān)文章

  • SpringBoot項(xiàng)目部署到騰訊云的實(shí)現(xiàn)步驟

    SpringBoot項(xiàng)目部署到騰訊云的實(shí)現(xiàn)步驟

    本文主要介紹了SpringBoot項(xiàng)目部署到騰訊云的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java實(shí)現(xiàn)文件批量重命名,移動和刪除

    Java實(shí)現(xiàn)文件批量重命名,移動和刪除

    這篇文章主要為大家介紹了如何利用Java語言實(shí)現(xiàn)批量重命名,批量移動文件,批量刪除tmp文件等功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • SpringBoot自動配置源碼深入刨析講解

    SpringBoot自動配置源碼深入刨析講解

    這篇文章主要介紹了SpringBoot自動配置原理分析,SpringBoot是我們經(jīng)常使用的框架,那么你能不能針對SpringBoot實(shí)現(xiàn)自動配置做一個詳細(xì)的介紹。如果可以的話,能不能畫一下實(shí)現(xiàn)自動配置的流程圖。牽扯到哪些關(guān)鍵類,以及哪些關(guān)鍵點(diǎn)
    2022-09-09
  • Java判斷2個List集合是否相等(不考慮元素的順序)

    Java判斷2個List集合是否相等(不考慮元素的順序)

    今天小編就為大家分享一篇關(guān)于Java判斷2個List集合是否相等(不考慮元素的順序)的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Spring?Bean名稱不會被代理的命名技巧

    Spring?Bean名稱不會被代理的命名技巧

    Spring Bean一些使用小細(xì)節(jié)就是在不斷的源碼探索中逐步發(fā)現(xiàn)的,今天就來和小伙伴們聊一下通過 beanName 的設(shè)置,可以讓一個 bean 拒絕被代理
    2023-11-11
  • java實(shí)現(xiàn)日歷效果的示例代碼

    java實(shí)現(xiàn)日歷效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用java實(shí)現(xiàn)打印某年全部的日歷信息,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • Java基礎(chǔ):徹底搞懂java多線程

    Java基礎(chǔ):徹底搞懂java多線程

    篇文章主要介紹了Java多線程的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java線程相關(guān)知識,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-08-08
  • 使用Java計(jì)算屏幕的PPI的方法詳解

    使用Java計(jì)算屏幕的PPI的方法詳解

    在現(xiàn)代電子設(shè)備中,屏幕的分辨率和顯示效果是用戶非常關(guān)注的一個指標(biāo),PPI(Pixels Per Inch,每英寸像素?cái)?shù))是衡量屏幕顯示精度的重要參數(shù)之一,PPI越高,屏幕顯示的圖像越細(xì)膩,視覺效果越好,本文將詳細(xì)介紹PPI的概念、計(jì)算方法,并通過Java代碼實(shí)現(xiàn)PPI的計(jì)算
    2025-02-02
  • 泛談Java NIO

    泛談Java NIO

    java.nio全稱java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO),使用它可以提供非阻塞式的高伸縮性網(wǎng)絡(luò)。下面我們來簡單了解一下吧
    2019-05-05
  • springboot連接oracle全流程

    springboot連接oracle全流程

    這篇文章主要介紹了springboot連接oracle全流程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

嘉禾县| 旌德县| 兴义市| 武强县| 手游| 桃园市| 南宁市| 鹿泉市| 平南县| 昌黎县| 大名县| 容城县| 绥滨县| 常德市| 炉霍县| 卢氏县| 新昌县| 金溪县| 宜章县| 兴和县| 景泰县| 京山县| 额尔古纳市| 阜城县| 札达县| 濮阳县| 襄樊市| 阿合奇县| 洞口县| 依兰县| 永寿县| 昭觉县| 山阴县| 玉树县| 甘孜县| 武安市| 湘阴县| 台南市| 乐山市| 清河县| 贵州省|