简介
在Java中,interrupt、interrupted和isInterrupted都是与线程中断相关的术语,但它们之间有一些重要的区别。
interrupt:这是一个方法,用于请求中断一个线程。当你调用一个线程的interrupt方法时,该线程的中断状态将被设置为true。这通常意味着该线程应该检查中断状态并采取适当的行动。如果线程正在执行一个长时间运行的操作,它应该定期检查中断状态,并在收到中断请求时停止。
interrupted:这是一个静态方法,用于清除当前线程的中断状态。当你调用Thread.interrupted()方法时,当前线程的中断状态将被清除,并且返回一个布尔值,表示线程是否曾经被中断。
isInterrupted:这是一个实例方法,用于检查线程的中断状态。它返回一个布尔值,表示线程的中断状态。如果线程的中断状态为true,则表示该线程已收到中断请求。
interrupt
interrupt()常用于停止线程,但是单独调用并不会停止线程,需要加入一个判断才能停止线程。下面是源码:
public void interrupt() {
if (this != Thread.currentThread())
checkAccess();
synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
interrupt0(); // Just to set the interrupt flag
b.interrupt(this);
return;
}
}
interrupt0();
}
复制
interrupted和isInterrupted
这两个方法用于判断线程是否停止,
interrupted() 是静态方法,判断当前执行线程是否停止。
isInterrupted()是对象方法,判断该对象是否已经中断;
这两个的区别是:
interrupted具有清除状态的功能,如果两次调用interrupt()方法,则第二次会将中断状态清除,变为false;
而isInterrupt()没有这个功能;
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
public boolean isInterrupted() {
return isInterrupted(false);
}
下面对interrupt()清除状态演示;
public static void main(String[] args){
Thread.currentThread().interrupt();
System.out.println("当前线程是否停止,第一次调用结果"+Thread.interrupted());
System.out.println("当前线程是否停止,第二次调用结果"+Thread.interrupted());
System.out.println("当前线程是否停止,第三次调用结果"+Thread.interrupted());
Thread thread=new Thread();
System.out.println("当前线程是否停止"+thread.isInterrupted());
System.out.println("当前线程是否停止"+thread.isInterrupted());
}
结果
当前线程是否停止,第一次调用结果true
当前线程是否停止,第二次调用结果false
当前线程是否停止,第三次调用结果false
当前线程是否停止false
当前线程是否停止false
总结
interrupt方法用于请求中断线程。
interrupted和isInterrupted方法用于检查线程的中断状态。
通常,当你在编写需要处理线程中断的代码时,你会使用这些方法来处理中断请求、检查线程状态以及清除中断状态。
评论