文档章节

Java 多线程 - 线程 - 中断 - 3

pan_1308
 pan_1308
发布于 2017/08/28 17:21
字数 377
阅读 17
收藏 1

实例背景

如果线程实现了复杂的算法并且分布在几个方法中,或者线程里面有递归调用的方法,这样的话,就得需要使用一个更好的机制来控制线程的中断。为了达到这个目的,java 提供了 InterruptedException异常,当检查到线程中断的时候,就抛出这个异常,然后在 run()方法 中捕获 并处理这个异常。

示例:线程类实现 在一个文件夹及其子文件夹中寻找一个指定的文件。

import java.io.File;
/**
 * 中断控制 - run方法中 通过捕获 InterruptedException 异常来控制 线程是否中断
 */
public 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);
		try {
		   if(file.isDirectory()){
			   directoryProcess(file);
		   }
		} catch (InterruptedException e) { // 通过 run 方法来 捕获  InterruptedException 来判断是否被中断.
			System.out.println(Thread.currentThread().getName() + " 被中断...");
		}
	}
	
	// 目录操作
	public void directoryProcess(File file) throws InterruptedException{
		File[] list = file.listFiles();
		if(list != null && list.length > 0){
			for(int i=0;i<list.length;i++){
				if(list[i].isDirectory()){ // 目录
					directoryProcess(list[i]);
				}else{ // 文件
					fileProcess(list[i]);
				}
			}
		}
	}
	
	// 文件操作
	public void fileProcess(File file) throws InterruptedException{
		if(fileName.equals(file.getName())){
			System.out.println(Thread.currentThread().getName()+",文件名:"+file.getName()+",路径:"+file.getAbsolutePath() +",找到了..");
		}else{
			System.out.println("【fileName】-" + fileName +",【file.getName】-"+file.getName() +",没被找到..");
		}
		if(Thread.interrupted()){ //判断 线程是否被中断
			throw new InterruptedException();
		}
	}
}
public class FileSearchTest {

	public static void main(String[] args) {
		FileSearch fileSearch = new FileSearch("F:\\logs", "warn.log");
		Thread thread = new Thread(fileSearch);
		thread.start();
		
		try {
			Thread.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		thread.interrupt();
	}
}
// console结果:
【fileName】-warn.log,【file.getName】-log4j.properties,没被找到..
Thread-0 被中断...

 

© 著作权归作者所有

共有 人打赏支持
pan_1308
粉丝 5
博文 95
码字总数 58819
作品 0
黄冈
私信 提问
Java多线程可以分组,还能这样玩!

前面的文章,栈长和大家分享过多线程创建的3种方式《实现 Java 多线程的 3 种方式》。 但如果线程很多的情况下,你知道如何对它们进行分组吗? 和 Dubbo 的服务分组一样,Java 可以对相同性质...

Java技术栈
11/09
0
0
多线程编程读书笔记之线程中断的本质

Java试图提供过抢占式限制中断,但问题多多,例如已被废弃的Thread.stop、Thread.suspend和 Thread.resume等。另一方面,出于Java应用代码的健壮性的考虑,降低了编程门槛,减少不清楚底层机...

刘学炜
2012/07/03
0
0
cpu个数、核数、线程数、Java多线程关系的理解

一 cpu个数、核数、线程数的关系 cpu个数:是指物理上,也及硬件上的核心数; 核数:是逻辑上的,简单理解为逻辑上模拟出的核心数; 线程数:是同一时刻设备能并行执行的程序个数,线程数=cp...

码代码的小司机
11/06
0
0
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
Java 学习(27)---(多线程 / Runnable 接口 / 调度和优先级)

多线程 1 .概念 多线程:一个应用程序有多条执行路径进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 ...

姜白告
08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue-cli 3 分环境打包

在vue-cli3的项目中, npm run serve时会把process.env.NODE_ENV设置为‘development’; npm run build 时会把process.env.NODE_ENV设置为‘production’; 此时只要根据process.env.NODE_...

灰白发
2分钟前
0
0
集合初始化,泛型及相关操作

集合初始化通常进行分配容量,设置特定参数等相关工作,推荐在任何情况下,都需要显式地设定集合容量的初始大小。 ArrayList 使用无参构造时,默认大小为 10 ,也就是说在第一次add的时候,分...

Canaan_
12分钟前
1
0
Sping之项目中pofile的应用

工程中,我们必须要面对的一件事就是, 开发环境中使用的数据库连接地址等与生产上的不同, 如果上线, 那么我们是否还要手动修改这些地址么, 这样做有很多弊端, 不方便, 这时我们就可以使用spr...

克虏伯
19分钟前
0
0
Linux中安装MySQL

Linux中安装MySQL 一、准备工作 此处准备的操作系统位CentOS 7。 MySQL安装包: MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm 将准备......

星汉
24分钟前
0
0
深入理解Hadoop之HDFS架构

Hadoop分布式文件系统(HDFS)是一种分布式文件系统。它与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的差异是值得我们注意的: HDFS具有高度容错能力,旨在部署在低成...

架构师springboot
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部