Java中的多线程:sleep, wait, join 与 interrupt()的关系

来源:互联网 发布:淘宝店铺资质1000元 编辑:程序博客网 时间:2024/05/12 14:28

当线程执行sleep,wait,join的操作时,首先会检查当前线程的中断标志位(INT)是否为中断状态,如果是,则抛出InterruptedException,否则的话,就顺利进入各自想要的状态:睡觉,等待,阻塞调用线程

而 interrupt() 函数的作用就是将INT的状态设为True(即使当前线程处于中断状态),仅此而已,它并没有去做实际的中断线程的操作,所以,如果要使得sleep,wait,join在调用时抛出异常,必须满足以下两个简单的条件

1:interrupt()的调用必须在sleep,wait,join之前或之中(即等待或者是睡眠时期)。(肯定要在之前啦,不然人家已经执行完成了,都已经检测过标志位了,你再去设置中断标志位,人家又不会再去检查了)

2:interrupt()和sleep的调用是针对同一个线程的。即Thread1.interrupt() 与Thread1.sleep()连用;

而 interrupt()和wait,join的调用是既可以针对统一线程也可以针对不同线程的。当针对不同线程时,要满足:Thread1.interrupt() 与Thread2.sleep(), Thread.wait()连用,并且Thread2的操作应该是建立在Thread1之上的。具体原理是与线程间的阻塞有关,可参考一些教材,这里不在赘述。

原创粉丝点击