线程基础之线程中断
Java可以中断一个线程,但只是改变线程的中断状态,至于被中断的线程接下来怎么办那是当事线程的事。
线程处于阻塞状态(包括调用sleep和wait及wait(time)),对该线程调用interrupt()时会抛出InterruptedException异常,这也是为什么调用sleep及wait方法时会抛出InterruptedException受查异常的原因。
对某个线程调用了interrupt()方法,则该线程会改变中断状态为true了。
当前线程调用isInterrupted()可以检测中断状态,如果状态为true了,说明有别的线程向当前线程发送了中断请求,至于当前线程怎么做那是当前线程的事。
当前线程中调用静态方法interrupted(),如果当前线程的中断状态为true的话,该方法会把当前线程的中断状态恢复到原本的状态即false,并且该方法本身返回true;
如果再次立即调用该方法,不会再改变当前线程的中断状态了因为前一次调用已经恢复了,但是这个方法本身返回false因为这次没有改变当前的线程中断状态啊;
所以这个静态方法可以间接的检测线程状态,不过有副作用,副作用就是可能会改变线程目前的中断状态。
查看源码interrupted()方法其实调用的是Thread.currentThread().isInterrupted(true)方法即IsInterrupted()的重载方法,interrupted()是作用于当前线程,isInterrupted()是作用于调用该方法的线程对象所对应的线程。