美文网首页
1_基础知识_chapter05_基础构建模块_4_阻塞方法与中

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

作者: 米都都 | 来源:发表于2019-01-22 17:54 被阅读0次
  • 和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异常而不作任何处理!!!这样线程被中断的证据已经被丢失更高层的代码无法处理

相关文章

网友评论

      本文标题:1_基础知识_chapter05_基础构建模块_4_阻塞方法与中

      本文链接:https://www.haomeiwen.com/subject/okzqjqtx.html