文档章节

线程中断的控制

柳哥
 柳哥
发布于 2015/04/19 23:35
字数 418
阅读 193
收藏 5
点赞 0
评论 0

上一个例子中使用的机制,可以使用在线程很容易被中断的情况下。但是如果线程实现了复杂的算法并且分布在几个方法中,或者线程里有递归调用的方法,我们就得使用一个更好的机制来控制线程的中断。为了达到这个目的,Java提供了InterruptedException异常。当检查到线程中断的时候,就抛出这个异常,然后在run()中捕获并处理这个异常。

package concurrency;

import java.io.File;
import java.util.concurrent.TimeUnit;

class FileSearch implements Runnable {
    private String initPath;
    private String 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());
            }
        }
    }
    private void directoryProcess(File file) throws InterruptedException {
        File[] list = file.listFiles();
        if(list != null){
            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();
        }
    }
    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();
        }
    }
}

public class Test4{
    public static void main(String[] args) {
        FileSearch seatcher = new FileSearch("/home/fuhd/apk/gnapk/tencent/122","com.ymall.presentshop.apk");
        Thread thread = new Thread(seatcher);
        thread.start();
        //等待十秒,然后中断线程
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
    }
}

在本范例中,我们使用了Java异常来控制线程的中断。当运行这个范例时,程序将进入文件夹查找是否包含指定的文件。例如,如果要查找的文件夹目录结构是\b\c\d,这个程序将递归调用processDirectory()方法3次。不管递归调用了多少次,只要线程检测到它已经被中断了,就会立即抛出InterruptedException异常,然后继续执行run()方法。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 202
博文 394
码字总数 347782
作品 0
杭州
技术主管
中断优先级和中断线程优先级

中断是一种当今很重要的硬件与cpu通信的方式,主板上集成很多硬件,那么就可以认为会有很多中断,但是cpu的数目往往要少得多,那么肯定会有多个硬件中断竞争一个cpu的情况,任何系统(包括自...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

SylixOS线程私有数据浅析

目录 1.线程私有数据概述 1 2.线程私有数据的相关API函数流程浅析 1 2.1 加入线程私有变量 1 2.2 删除线程私有变量 3 2.3 设置私有线程变量 6 2.4 获得线程私有变量值 8 3.总结 10 4.参考文献...

星域之旅 ⋅ 2017/05/19 ⋅ 0

【线程管理】之篇一

【线程管理】之篇一 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、简介 二、简单介绍线程创建和运行...

泥沙砖瓦浆木匠 ⋅ 2014/07/26 ⋅ 0

【转】ReentrantLock--synchronized和ReentrantLock区别及使用

synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候。 1.某个线程在等待一个锁的控制权的这段时...

AFinalDream ⋅ 2017/04/16 ⋅ 0

深入研究 Java Synchronize 和 Lock 的区别与用法

在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方。 我们...

again-Y ⋅ 2013/10/23 ⋅ 5

SylixOS设置CPU亲和性

1 概述 CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器的倾向性。SylixOS支持对称多处理器(Symmetric Multi-Processor),其线程是调度的最小单位,...

Jackstraw瑞 ⋅ 2017/04/09 ⋅ 0

Windows与Linux的异步IO在设计上的差异

在windows操作系统内核中,首先要明白四个概念,apc(异步过程调用),dpc(延迟过程调用),irp(io请求包)以及基于优先级的抢占式调度,下面分别解释: 1.apc。 异步过程调用类似于linux...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

Java多线程开发技巧

很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读《Java并发编程实践》了解到了很多不为我知但又...

凯文加内特 ⋅ 2015/10/19 ⋅ 0

day23-----------多线程(传智视频)

多线程概述 package cn.itcast_01;/* * 进程: * 正在运行的程序,是系统进行资源分配和调用的独立单位。 * 每一个进程都有它自己的内存空间和系统资源。 * 线程: * 是进程中的单个顺序控制...

萧小蚁 ⋅ 2016/02/23 ⋅ 0

异步事件:轮询与中断

CPU几乎把所有的时间都花费在从内存获取指令并运行它们的过程中。然而,CPU和主存仅仅只是计算机硬件系统中众多组件的其中两个。一个完整的系统还包含其他的设备,比如: 硬盘或者固态硬盘,...

宇的季节 ⋅ 2017/12/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 19分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 26分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 33分钟前 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 34分钟前 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 39分钟前 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 42分钟前 ⋅ 0

建造模式

《JAVA与模式》之建造模式

Cobbage ⋅ 56分钟前 ⋅ 0

WePY框架开发的小程序如何在微信web开发者工具中运行起来

一、首先需要安装node.js,安装步骤如下: 首先下载安装包 https://nodejs.org/en/download/ 点击下载相应的zip版本 然后将文件夹解压到任意目录 比如我这里解压到了:C:\Program Files\node...

Helios51 ⋅ 今天 ⋅ 0

使用EnumSet 代替位域(32)

1、位域(Bit field):使用or 运算将几个常量合并到一个集合中 位操作,可以有效地执行 AND 、OR 这样的位操作 但是 位域比int 常量枚举缺点更多 2、java.util 包里面的EnumSet 类是有效的替...

职业搬砖20年 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部