在線程中,wait()、join()、sleep()三個方法都是進行阻塞的方法。對應可以使用interrupt()方法進行打斷,被打斷后線程會拋出打斷異常,但是不會修改IsInterrupt,也就是此時去調用IsInterrupted()方法后獲得的實際上是false。
而當線程處于非阻塞狀態時,使用interrupted()方法對線程進行打斷,此時不會出現打斷異常,但是會將IsInterrupt設置為true。
這里需要引入兩階段終止模式
其實際就是一種正確的線程終止模式,如果我們現在有一個線程需要去終止,如果我們直接調用stop()指令,考慮線程帶鎖的情況,線程獲取了鎖并且還未釋放鎖,此時被stop,顯然線程無法釋放鎖,其他線程就無法獲取鎖。顯然這不是合理的。
為了解決這個問題,我們可以使用interrupt來實現線程終止,如果線程此時處于wait()、join()、sleep(),我們需要捕獲打斷異常,并且手動將IsInterrupt置為true,而當線程在做其他事的時候,打斷操作會自行將IsInterrupt置為true。
也就是說,只要執行了打斷操作,都會獲得IsInterrupt為true,此時我們只需要添加一個固定的條件判斷,當IsInterrupt為true時,就進行后續處理,比如釋放鎖,釋放其他資源等等,最終進行退出。
比如上述圖中的一個監控線程,全程在進行監控,現在想要終止線程,具體流程圖如圖。