Thread中斷的理解

★中斷的理解:1)中斷能夠理解爲線程的一個標識位屬性;2)表示一個運行中的線程是否被其餘線程進行了中斷操做

中斷比如其餘線程向該線程打了個招呼,其餘線程經過調用該線程的interrupt()方法對其進行中斷操做。java

啥意思?this

如上圖中所示,運行中的線程(main主線程)調用線程countThread的interrupt()方法,向countThread線程打了個「招呼」,對countThread線程作了中斷操做。咱們看JDK源碼中interrupt()方法的源碼:spa

看註釋:線程

// Just to set the interrupt flagcode

說的很是明白,對標識位進行了設置。就是將 interrupt flag 設置爲true。將線程的中斷標識位 interrupt flag 屬性設置爲了true。blog

爲何說【中斷能夠理解爲線程的一個標識位屬性】?

什麼叫能夠理解爲?看一下Thread的JDK源碼,實際上找不到這個屬性,因此若是有這個屬性的話,恐怕也是在更底層(比JDK源碼更底層)存在的。因此爲了更好的理解,不妨想象有那麼一個變量,用來標識線程是否被中斷。源碼

線程A能夠經過調用線程B的class

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);
}

方法來對當前線程的中斷標識位進行復位。

相關文章
相關標籤/搜索