首页 > 代码库 > JAVA 并发编程之线程中断的控制
JAVA 并发编程之线程中断的控制
今天,拿一个简单例子来说明线程中断的控制。
场景:在特定的目录,寻找特定的文件,如果找到,则10秒线程中断。如果没找到,直接抛出InterruptedException异常,并在run()方法捕获处理这个异常。
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.在FileSearch类中,实现run()方法。在run()方法中,检查相关目录,如果有,就调用directoryProcess()方法。否则,就抛出InterruptedException异常,并捕获这个异常
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());
}
}
}
4.实现directoryProcess()方法,这个方法会获取一个文件夹里的所有文件和子文件夹,并进行处理。对于每个目录,都会递归调用。对文件夹里的文件,会调用fileProcess()方法。处理完这个文件和文件夹后,将检查线程是不是被中断,是,就抛出InterruptedException异常。
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();
}
}
5.实现fileProcess()方法。将比较当前文件的文件名和要查找的文件名,如果匹配就讲信息打印在控制台上,做完话,线程将检查是不是被中断,如果是,就抛出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主类,并写一个包含main()方法的方法。
public class Main {
public static void main(String[] args){}
7.创建FileSearch类的一个对象,并用它作为传入参数来创一个线程对象,然后启动线程执行任务。
FileSearch search=new FileSearch("c:\\","log.txt");
Thread thread=new Thread(search);
thread.start();
8.等待10秒后,然后中断线程。
try{
TimeUnit.SECONDS.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
}
thread.interrupt();
}
9.运行结果
JAVA 并发编程之线程中断的控制