綜述:說到中斷線程呕缭,我們java中提供了一個stop方法昆码,不過已經(jīng)不建議使用了冗荸,因為stop方法一劍封喉父阻,線程來不及料理后事
1.兩階段終止模式講解
1)簡述:倆階段模式分成倆個階段覆致,一個是線程T1向T2發(fā)送終止指令侄旬,一個是T2響應終止指令
2)終止指令:我們java中線程要想處于終止狀態(tài)只能從Runable狀態(tài)到終止狀態(tài),所以終止指令第一個要做的就是讓線程初于Runnable狀態(tài)煌妈,這個步驟是通過interrupt方法完成儡羔。那在此基礎上,線程如何終止呢璧诵?我們優(yōu)雅的終止方式是讓線程執(zhí)行完run方法汰蜘,然后在合適的時機設一個中斷標識位進行中斷!所以終止指令包含interrupt方法和中斷標識之宿!
2.終止線程
1)代碼演示:
這個地方我們通過調(diào)用interrupt方法讓線程處于runnable狀態(tài)(并且設置一個中斷標識表示可以中斷)族操,在run方法中判斷線程的中斷標識位(這里的標識位是線程的中斷狀態(tài)),來中斷線程比被,但是如果出現(xiàn)異常色难,jvm會清除中斷狀態(tài),所以我們在catch方法中重新設置中斷狀態(tài)等缀!這里有一個缺點枷莉,就是如果調(diào)用第三方的類庫,沒有正確處理線程的中斷異常尺迂,例如第三方類庫在捕獲到Thread.sleep()方法拋出的中斷異常后笤妙,沒有重新設置線程的中斷狀態(tài)冒掌,那么就會導致線程不能夠正常終止。所以這里建議使用自己的中斷標識蹲盘!如下所示
2)注意點:其實我們正常情況是覺得這個volatile在這里沒有這個必要股毫,因為synchronized保證原子性的同時,也能間接的保證可見性(happens-before原則)召衔,但問題是start方法里又啟動了一個新的線程铃诬,synchronized管不到這個新的線程!所以我們這里volatile一定要加薄嫡,保證可見性
3.線程池的關閉方式
主要是通過倆個方法氧急,一個shutdown,一個shutdownNow毫深!shutdown是一種很保守的方式吩坝,執(zhí)行這個方法之后,線程池就會拒絕接受新的任務哑蔫,但是會把當前線程池中的任務執(zhí)行結(jié)束钉寝!而shutdownNow則是不僅拒絕任務,還會中斷當前線程池中正在執(zhí)行的任務闸迷,不過這些被剝奪執(zhí)行機會的任務會作為shutDownNow()方法的返回值返回嵌纲。其實從本質(zhì)上講,這倆個方法也是用的倆階段終止模式腥沽,只是終止指令的范圍不同逮走,前者只影響阻塞隊列接受任務,后者擴大到線程池中所有的任務今阳!