什么是阻塞方法?为什么会抛出InterruptedException?

一般方法的完成只取决于它所要做的事情,以及是否有足够多可用的计算资源(CPU 周期和内存)。

而阻塞方法的完成还取决于一些外部的事件,例如计时器到期,I/O 完成,或者另一个线程的动作(释放一个锁,设置一个标志,或者将一个任务放在一个工作队列中)。

这就导致一个问题,阻塞方法等不到所等的事件就无法终止

因此令阻塞方法可取消就非常有用。例如:Thread.sleep()/thread.interrupt() 和 Object.wait()/thread.interrupt() 支持的中断机制就是一种取消机制,当一个线程请求另一个线程停止它正在做的事情,便抛出 InterruptedException

线程中断后发生什么?

首先:每个线程都有一个与之相关联的 Boolean 属性,用于表示线程的中断状态,中断状态初始时为 false

当另一个线程通过调用 Thread.interrupt() 中断一个线程时,会出现以下两种情况之一:

1. 如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、 Thread.join() 或 Object.wait(),那么它将改变状态,取消阻塞并抛出InterruptedException

2. 其他情况, interrupt() 只是设置线程的中断状态。

那么对于第二种情况应该如何处理?

可以在被中断线程中运行的代码中轮询中断状态,看看它是否被请求停止正在做的事情。

中断状态可以通过 Thread.isInterrupted() 来读取,并且可以通过一个名为 Thread.interrupted() 的操作读取和清除。

因此,中断只是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。

有些方法,例如 Thread.sleep(),会很认真地对待这样的请求,但每个方法不是一定要对中断作出响应。

简单来说,我要你中断,你答不答应,随便。。

最新文章

  1. Eclipse启动参数
  2. [转]listview加载性能优化ViewHolder
  3. Sublime多行编辑快捷键
  4. OpenCV(5) 对比度和亮度
  5. JavaEE基础(十)
  6. IPv6 tutorial 3 New features: IPsec and LAN features
  7. AndroidStudio旧模板使用方法
  8. tr转换或删除字符
  9. 《JS中的面向对象技术》
  10. [Unity c#]c#中的反射
  11. 模拟eval
  12. centos 7刚安装后无法联网解决
  13. 谈下mysql预处理基础
  14. ace-socket-reconnect
  15. Sharepoint 性能之SQL Server内存设置
  16. 使用ptrace向已运行进程中注入.so并执行相关函数(转)
  17. OS之进程管理---孤儿进程和僵尸进程
  18. HDU 1565 方格取数(1)(最大点权独立集)
  19. apply新用法,最大值查找
  20. Scrum立会报告+燃尽图(十一月十八日总第二十六次):功能开发与讨论贡献分配规则

热门文章

  1. 尼康D90多点对焦
  2. 【转】HDC,CDC,CWindowDC,CClientDC,CPaintDC等等
  3. Chrome浏览器快捷键(收藏!)
  4. flask-第三方组件
  5. Oracle之完全卸载
  6. 巨蟒python全栈开发flask2
  7. Codeblocks自动代码格式化+快捷键
  8. CXF 框架
  9. python用whl文件安装包
  10. PyMongo和MongoEngine