1_基础知识_chapter05_基础构建模块_4_阻塞方法与中断方法

  • 和Thread.sleep一样, BlockingQueue的put和take方法会抛出编译器异常 InterruptedException; __如果一个方法抛出InterruptedException, 说明这个方法是一个阻塞方法

  • Thread提供了interrupt(), interrupted(), isInterrupted()方法(还没看)

  • 每个线程都有一个bool类型的标志位用来表示线程的中断状态, 当调用interrupt时会设置某个线程的这个标志位

  • 中断是一种协作机制, 对一个线程调用t1.interrupt()不会让他t1停下来,仅仅是告诉t1应该处理

  • 处理InterruptedException的方式

    (1) 直接传递异常

    不捕获异常直接抛出 或捕获异常做简单清理再次抛出

    (2) 恢复中断

    当代码是Runnable的一部分时只能捕获InterruptedException, 并通过调用当前线程的interrupt()方法恢复中断状态(否则中断状态会消失), 这样更高层代码将看到引发了一个中断

    示例

      public class TaskRunnable implements Runnable {
    
          BlockingQueue<Task> queue;
    
          public void run() {
      
              try {
                  processTask(queue.take());
              } catch (InterruptedException e) {
          
                  // restore interrupted status
                  Thread.currentThread().interrupt();
              }
          }
    
          void processTask(Task task) {
              // Handle the task
          }
    
          interface Task {
          }
      }
    

    千万不要只捕获InterruptedException异常而不作任何处理!!!这样线程被中断的证据已经被丢失更高层的代码无法处理

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容