今天在一个多线程的项目中碰到了interrupted方法,熟悉又模糊,只记得它和isInterrupted都是判断线程是否中断的方法,却又记不清它俩的区别了。
翻看源码
/**
* Tests whether the current thread has been interrupted. The
* <i>interrupted status</i> of the thread is cleared by this method. In
* other words, if this method were to be called twice in succession, the
* second call would return false (unless the current thread were
* interrupted again, after the first call had cleared its interrupted
* status and before the second call had examined it).
*
* <p>A thread interruption ignored because a thread was not alive
* at the time of the interrupt will be reflected by this method
* returning false.
*
* @return <code>true</code> if the current thread has been interrupted;
* <code>false</code> otherwise.
* @see #isInterrupted()
* @revised 6.0
*/
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
...
/**
* Tests whether this thread has been interrupted. The <i>interrupted
* status</i> of the thread is unaffected by this method.
*
* <p>A thread interruption ignored because a thread was not alive
* at the time of the interrupt will be reflected by this method
* returning false.
*
* @return <code>true</code> if this thread has been interrupted;
* <code>false</code> otherwise.
* @see #interrupted()
* @revised 6.0
*/
public boolean isInterrupted() {
return isInterrupted(false);
}
我们知道,interrupted是个静态方法,isInterrupted是个普通方法;二者的内部都调用了isInterrupted的重载方法,而重载方法的参数不同,interrupted跟的参数是true,isInterrupted跟的参数是false;注意就是因为这个参数true和false,导致了它俩的区别。
先看简单的,isInterrupted的源码大致意思是 “测试此线程是否已被中断。 线程的中断状态不受此方法的影响。返回true表示这个线程已被中断,false则未被中断” ,比较好理解。再看interrupted的源码 “测试当前线程是否已被中断。 此方法清除线程的中断状态。 换句话说,如果连续两次调用此方法,则第二次调用将返回false(除非当前线程在第一次调用已清除其中断状态之后且在第二次调用检查之前再次中断)。返回true表示这个线程已被中断,false则未被中断” 此处就有点绕了,如果是英语不太好的同学直接看英文源码就容易被绕进去,其实看中文就很容易懂了,interrupted和isInterrupted都是用来测试当前线程是否已被中断,返回true表示这个线程已被中断,false则未被中断。不同的是interrupted执行完判断后,还会多做一件事,就是上面我们标红的清除线程的中断状态。(也就意味着如果当前线程是中断状态,则调用interrupted判断会返回true,但是同时会把中断状态给清除)
分析完源码,我们写个简单的demo来验证一下
public class InterruptedDemo1 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"--->已启动");
//调用线程中断方法
Thread.currentThread().interrupt();
System.out.println(Thread.currentThread().getName()+"的中断状态1--->"+Thread.currentThread().isInterrupted()); // 这个方法得到的结果:Interrupt:true
System.out.println(Thread.currentThread().getName()+"的中断状态2--->"+Thread.interrupted()); // 这个方法得到的结果:Interrupt:true
System.out.println(Thread.currentThread().getName()+"的中断状态3--->"+Thread.currentThread().isInterrupted()); // 这个方法得到的结果:Interrupt:false
System.out.println(Thread.currentThread().getName()+"的中断状态4--->"+Thread.interrupted()); // 这个方法得到的结果:Interrupt:false
System.out.println(Thread.currentThread().getName()+"的中断状态5--->"+Thread.currentThread().isInterrupted()); // 这个方法得到的结果:Interrupt:false
System.out.println(Thread.currentThread().getName()+"的中断状态6--->"+Thread.interrupted()); // 这个方法得到的结果:Interrupt:false
System.out.println(Thread.currentThread().getName()+"--->end");
}
}
执行结果:
main--->已启动
main的中断状态1--->true
main的中断状态2--->true
main的中断状态3--->false
main的中断状态4--->false
main的中断状态5--->false
main的中断状态6--->false
main--->end
和我们分析的一样。
总结:interrupted和isInterrupted都是用来测试当前线程是否已被中断,返回true表示这个线程已被中断,false则未被中断。不同的是interrupted执行完判断后,还会清除线程的中断状态。