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.运行结果

   

    

 

 

   

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。