和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_阻塞方法与中断方法
最新推荐文章于 2022-08-03 11:57:33 发布