美文网首页
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