Thread之中断

中断是什么:

首先要清楚, 中断是一个协作机制, 线程a是一个待中断线程. 当线程b调用线程a的中断函数时, (注意这里时调用被中断线程的interrupt方法), 是在跟线程a商量说我想要你中断. 并且这时候将a的中断位置为true.

中断时发生了什么

a的反应取决于a的状态. 分为以下两种:

  1. 当a阻塞(Object.wait, Thread.join和Thread.sleep)时, 会直接抛出interruptException(IE)异常, 并且将中断位归位(重置为false) 阻塞也分为两种情况
    1. 当a是被sleep()阻塞时, 由于sleep()方法不释放锁, 所以此时sleep()直接响应中断, 抛出IE异常
    2. 当a是被wait()阻塞时, 由于wait()方法释放了锁, 所以此时wait()方法要等到获取到锁(也就是cpu)时间时, 才能响应中断. (wait()等待notify(), 并在notify()所在的方法完全执行完时被放入待执行队列进入runnable状态)
  2. 当a在正常运行时, 是需要通过Thread.isInterrupted()判断中断状态的. 并且这时候需要a线程自己去决定怎么处理这个中断.
中断状态的检测和变化

中断状态为True和False. 主要由Thread.interrpt(), Thread.isInterrpted(), Thread.nterrpted()这三个方法进行管理.
IMG_0580.jpg

方法 作用
Thread.isInterrpted() 主要用来检测线程中断状态, 不对其做任何改变
Thread.interrpt() 唯一一个将线程中断状态置为True的方法
Thread.interrpted() 检测并返回线程当前中断状态, 同时将中断状态设置为false
怎么处理中断
  1. 不应该忽视中断, 比如在cathc(IE)之后不做任何处理

  2. 处理时机

显然,作为一种协作机制,不会强求被中断线程一定要在某个点进行处理。实际上,被中断线程只需在合适的时候处理即可,如果没有合适的时间点,甚至可以不处理,这时候在任务处理层面,就跟没有调用中断方法一样。“合适的时候”与线程正在处理的业务逻辑紧密相关,例如,每次迭代的时候,进入一个可能阻塞且无法中断的方法之前等,但多半不会出现在某个临界区更新另一个对象状态的时候,因为这可能会导致对象处于不一致状态。
处理时机决定着程序的效率与中断响应的灵敏性。频繁的检查中断状态可能会使程序执行效率下降,相反,检查的较少可能使中断请求得不到及时响应。如果发出中断请求之后,被中断的线程继续执行一段时间不会给系统带来灾难,那么就可以将中断处理放到方便检查中断,同时又能从一定程度上保证响应灵敏度的地方。当程序的性能指标比较关键时,可能需要建立一个测试模型来分析最佳的中断检测点,以平衡性能和响应灵敏性。

  1. 处理方式

视实际情况而定了。有些程序可能一检测到中断就立马将线程终止,有些可能是退出当前执行的任务,继续执行下一个任务……作为一种协作机制,这要与中断方协商好,当调用interrupt会发生些什么都是事先知道的,如做一些事务回滚操作,一些清理工作,一些补偿操作等。若不确定调用某个线程的interrupt后该线程会做出什么样的响应,那就不应当中断该线程。

参考链接: www.cnblogs.com/duanxz/p/44…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享