咱們知道當調用 Thread 的 start()方法,執行完 run()方法後,或在 run()方法中 return,線程便會天然消亡。可是若是一些線程長時間的在後臺運行,那麼怎麼去中止呢?下面介紹幾種方法:安全
這種方式比較靈活,無論是經過繼承 Thread 類仍是實現 Runnable 接口均可以使用,而使用實現 Runnable 接口的方式只不能用 下面的 interrupt() 方法。socket
預期結果:打印三次線程 A 正在運行中 實際結果:預期結果:打印 "終止線程" 之後立馬中止線程 實際結果:打印 "終止線程" 之後 又打印了幾回 "線程 A 正在運行中" 才中止線程線程
因此這種方式並非很能及時的中止線程。3d
線程處於阻塞狀態,如使用了sleep,同步鎖的wait,socket中的receiver,accept等方法時,會使線程處於阻塞狀態。當調用線程的interrupt()方法時,會拋出InterruptException異常。阻塞中的那個方法拋出這個異常,經過代碼捕獲該異常,而後break跳出循環狀態,從而讓咱們有機會結束這個線程的執行cdn
預期結果:打印 "終止線程" 之後立馬中止線程 實際結果:打印 "終止線程" 之後立馬中止線程blog
序中能夠直接使用thread.stop()來強行終止線程,可是stop方法是很危險的,就象忽然關閉計算機電源,而不是按正常程序關機同樣,可能會產生不可預料的結果,不安全主要是:thread.stop()調用以後,建立子線程的線程就會拋出ThreadDeatherror的錯誤,而且會釋放子線程所持有的全部鎖。通常任何進行加鎖的代碼塊,都是爲了保護數據的一致性,若是在調用thread.stop()後致使了該線程所持有的全部鎖的忽然釋放(不可控制),那麼被保護數據就有可能呈現不一致性,其餘線程在使用這些被破壞的數據時,有可能致使一些很奇怪的應用程序錯誤。所以,並不推薦使用stop方法來終止線程。繼承
比較建議使用第一種,定義 volatile 關鍵字去實現,最終仍是要根據實際業務去選擇。接口
歡迎關注個人公衆號:同步