和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_阻塞方法与中断方法
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、wait--notify--sleep Object obj = new Object(); obj.wait...
- 这样的情景您也许并不陌生:您在编写一个测试程序,程序需要暂停一段时间,于是调用 Thread.sleep()。但是...
- 概要本章,会对线程的interrupt()中断和终止方式进行介绍。涉及到的内容包括: interrupt()说明 ...