線程被 wait() 通知后進入等待池,可以由本線程的 interrupt() 方法解救,使本線程可以去重新競爭鎖等等。是如何實現的呢?
實際上,中斷僅僅是在線程對象做一個標記而已,稱為中斷標志。中斷標志默認為false,在線程 t 調用自己的 t.interrupt() 方法后,此線程中斷標志就變成true。但是,中斷標志為true實際上不會對正常運行的線程產生影響,因為正常運行的線程不會自己去檢查自己的中斷標志。
只有那些被阻塞的線程才會不停的檢查自己的中斷標志,這個阻塞包括因 wait、join、yield、而未處於運行狀態的線程,這些被阻塞的線程如果檢查到自己的中斷標志為true,就會拋出InterruptException異常。
在線程正常運行時,也可以通過中斷標志做一些事情,比如利用它做分支條件、循環退出條件等。對於線程 t ,可以用 t.isInterrupted() 獲取 t 的中斷標志為 true or false。
public void run() { if(Thread.currentThread().isInterrupted()){ System.out.println("0"); } else { System.out.println("1"); } }
另外,還有Thread的靜態方法 Interrupted() 方法也可以返回中斷標志的狀態,但是這個方法在返回結果外還會清除線程的中斷標志,也就是把true置為false。而且需要注意的是 Interrupted() 作用的對象是當前運行的線程,而不是調用它的對象,畢竟它是個靜態方法。例如:
class Test { public static void main(String [] args) { Thread.Interrupted(); } }
t.Interrupted() 作用的不是線程對象 t ,而是 main 線程。