为什么需要线程中断?
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等。 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了。
那么不能直接把一个线程搞挂掉, 但有时候又有必要让它结束某种等待的状态 该怎么办呢?一个比较优雅而安全的做法是:使用等待/通知机制或者给那个线程一个中断信号, 让它自己决定该怎么做。
使用场景:
子线程sleep后等待的条件提前到来,或者调用子线程的join阻塞,但子线程运行时发现没法短时间结束,则需要通知主线程提前结束,即中断。
如何设置和检查
调用thread.interrupt(),设置被调用的线程中断标志为true;
Thread. interrupted()获取线程的中断标志后清除线程的中断标志位,将其置为false;
Thread. isInterrupted()获取线程的中断标志。
如何使用
当线程调用了一个可能抛出InterruptedExcepiton的方法的时候(比如join(),wait(),sleep()),在这些方法内部中,会不断的检查是否收到中断指令(中断标志位为true),一旦为true,则抛出一个InterruptedExcepiton异常.线程负责在catch()方法处理异常捕获的逻辑.
当线程没有执行上面的几个可能抛出InterruptedException的方法的时候,要想检查是否被中断,只能线程主动的调用Thread.interrupted()或者Thread.isinterrupted去获取线程中断标志位的状态,如果为true则表示收到中断指令(上述几个方法内部实现了这种逻辑),至于是否要抛出InterruptedException则由本线程自己决定,但通常是要抛出一个InterruptedException;
所以线程中断本质即线程是否能被中断取决于它是否检测中断标志或捕获中断异常并处理了中断状态