若是線程t由於Object.wait, Thread.join和Thread.sleep三種方法之一處於WAITING狀態,其餘線程調用t.interrupt()方法時線程t將接收到一箇中斷異常(InterruptedException),從而提前地終結WAITING狀態。java
interrupt()只是改變中斷狀態而已。interrupt()不會中斷一個正在運行的線程。這一方法實際上完成的是,給處於WAITING狀態的線程拋出一箇中斷信號,這樣線程就得以退出WAITING的狀態。測試
若是線程t沒有處於WAITING狀態,這時調用interrupt()將不起做用。spa
線程t在執行t.sleep或者調用其餘對象的wait或者其餘線程的join方法時,線程tt調用線程t的interrupt方法,的確這一個時候t會有InterruptedException 異常拋出來。但這實際上是線程t不斷循環檢查自身的中斷標識位而本身拋出的InterruptedException。若是線程t正在執行一些指定的操做時如賦值,for,while,if,調用方法等,都不會去檢查中斷狀態,因此線程t不會拋出 InterruptedException,而會一直執行着本身的操做。當線程t終於執行t.sleep或者調用其餘對象的wait或者其餘線程的join方法時,才立刻會拋出 InterruptedException。若線程t沒有執行t.sleep或者調用其餘對象的wait或者其餘線程的join方法,即沒有在線程裏本身檢查中斷狀態本身拋出InterruptedException的話,那InterruptedException是不會被拋出來的。線程
以wait方法爲例。線程t進入了對象a的等待隊列。此時線程t會不斷循環檢測本身的中斷標識位,若是發現中斷狀態被置位(設置爲true)了。那麼線程t要作的就是拋出InterruptedException異常,並從被WAITING狀態中跳出來。3d
測試線程是否被終止,這一調用不改變線程的中斷狀態。code
爲啥說【這一調用不改變線程的中斷狀態】?由於其最終調用對象
/** * Tests if some Thread has been interrupted. The interrupted state * is reset or not based on the value of ClearInterrupted that is * passed. */ private native boolean isInterrupted(boolean ClearInterrupted);
方法。參數 ClearInterrupted 表示是否清除中斷標識位。而isInterrupted()方法中調用時ClearInterrupted 爲false,即不清除中斷標識位。因此說 isInterrupted() 方法並不清除中斷標識位,故而【這一調用不改變線程的中斷狀態】。blog
測試當前線程(即正在執行這一命令的線程)是否被中斷。這一調用會產生一個反作用——將當前線程的中斷狀態設置爲false。隊列
能夠看到最終調用的是it
/** * Tests if some Thread has been interrupted. The interrupted state * is reset or not based on the value of ClearInterrupted that is * passed. */ private native boolean isInterrupted(boolean ClearInterrupted);
方法。參數 ClearInterrupted 表示是否清除中斷標識位。static boolean interrupted()調用時ClearInterrupted 設置爲true,即要清除中斷標識位,那麼調用後就將中斷標識位清除了,就是把中斷標識位又設置爲了false。