標籤:div margin logs 機制 nat ati 導致 中斷 rem
JAVA中有3種方式可以終止正在啟動並執行線程
①線程正常退出,即run()方法執行完畢了
②使用Thread類中的stop()方法強行終止線程。但stop()方法已經到期了,不推薦使用
③使用中斷機制interrupt()
1.stop()方法
stop()在java多線程中已經廢棄
1.stop()方法會導致釋放鎖的不良後果,資料不完整
比如一個上鎖了得方法:
threadA線程擁有了監視器,這些監視器負責保護某些臨界資源,比如說銀行的轉賬的金額。當正在轉賬過程中,main線程調用 threadA.stop()方法或者this.stop()。結果導致監視器被釋放,其保護的資源(轉賬金額)很可能出現不一致性。比如,A賬戶減少了100,而B賬戶卻沒有增加100,沒有保證資料原子性
2.當線程調用stop()方法時,會立刻終止線程的所有操作,並拋出ThreadDeath異常,通常不需要捕捉
2.interrupt() 中斷機制
這個方法是執行個體方法 ,但是它不會真的中斷一個正在啟動並執行線程,而是給線程打一個停止的標記,還需要配合判斷來優雅的終止線程
運行代碼
輸出結果
可以看的出來 ,interrupt() 並不會真正的停止正在啟動並執行線程,那麼如何停止線程呢
3.判斷線程的停止狀態
interrupted()方法與 isInterrupted()方法能反映當前線程的終止狀態
看的出來 interrupted() 是靜態方法 而 isInterrupted() 是執行個體方法
1.interrupted()方法
可以從上面看出 interrupt() 執行了線程 interrupted() 方法 第一調用返回是true , 第二次調用返回時false,在這裡查看interrupted()的源碼發現該方法會清楚中斷狀態
public boolean isInterrupted() { return isInterrupted(false); } /** * 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);
源碼發現該方法interrupted() 會調用 isInterrupted 方法 傳入 參數clean 狀態,調用改方法,改方法內部會清除中斷狀態
2. isInterrupted()方法
繼續根據上面的樣本建立 Run3
總結了兩個判斷線程中斷的區別 , 下面開始優雅的中斷線程了
java 多線程5: java 終止線程及中斷機制 (stop()、interrupt() 、interrupted()、isInterrupted())