★中断的理解:1)中断可以理解为线程的一个标识位属性;2)表示一个运行中的线程是否被其他线程进行了中断操作
中断好比其他线程向该线程打了个招呼,其他线程通过调用该线程的interrupt()方法对其进行中断操作。
啥意思?
如上图中所示,运行中的线程(main主线程)调用线程countThread的interrupt()方法,向countThread线程打了个“招呼”,对countThread线程做了中断操作。我们看JDK源码中interrupt()方法的源码:
看注释:
// Just to set the interrupt flag
说的非常明白,对标识位进行了设置。就是将 interrupt flag 设置为true。将线程的中断标识位 interrupt flag 属性设置为了true。
为什么说【中断可以理解为线程的一个标识位属性】?
什么叫可以理解为?看一下Thread的JDK源码,实际上找不到这个属性,所以如果有这个属性的话,恐怕也是在更底层(比JDK源码更底层)存在的。所以为了更好的理解,不妨想象有那么一个变量,用来标识线程是否被中断。
线程A可以通过调用线程B的
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();
}
方法来对线程B进行中断(可以理解为线程A通过调用线程B的interrupe()方法设置了线程B的中断标识位)。
线程A可以通过调用线程B的
public boolean isInterrupted() {
return isInterrupted(false);
}
方法来查看线程B是否被设置了中断标识位(中断标识位是否为true),并且不清除中断标识位。
线程A可以通过调用静态方法
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
方法来对当前线程的中断标识位进行复位。