Java結(jié)束線程的三種方法及該如何選擇
java常用的結(jié)束一個(gè)運(yùn)行中的線程的方法有3中:使用退出標(biāo)志,使用interrupt方法,使用stop方法。
1.使用退出標(biāo)志
即在線程內(nèi)部定義一個(gè)bool變量來判斷是否結(jié)束當(dāng)前的線程:
public class ThreadSafe extends Thread { public volatile boolean exit = false; public void run() { while (!exit){ //do work } } public static void main(String[] args) throws Exception { ThreadFlag thread = new ThreadFlag(); thread.start(); sleep(5000); // 主線程延遲5秒 thread.exit = true; // 終止線程thread thread.join(); System.out.println("線程退出!"); } }
這種情況一般是將線程的任務(wù)放在run方法中的一個(gè)while循環(huán)中,而由這個(gè)bool變量來對while循環(huán)進(jìn)行控制。
2.使用interrupt方法
這種方法需要判斷當(dāng)前的線程所處于的狀態(tài):
(1)當(dāng)前線程處于阻塞狀態(tài)時(shí)
線程處于阻塞狀態(tài)一般是在使用了 sleep,同步鎖的 wait,socket 中的 receiver,accept 等方法時(shí),會(huì)使線程處于阻塞狀態(tài)。
public class ThreadInterrupt extends Thread { public void run() { try { sleep(50000); // 延遲50秒 } catch (InterruptedException e) { System.out.println(e.getMessage()); } } public static void main(String[] args) throws Exception { Thread thread = new ThreadInterrupt(); thread.start(); System.out.println("在50秒之內(nèi)按任意鍵中斷線程!"); System.in.read(); thread.interrupt(); thread.join(); System.out.println("線程已經(jīng)退出!"); } }
注意這種情況寫,使用 interrupt 方法結(jié)束線程的時(shí)候,一定要先捕獲 InterruptedException 異常之后通過 break 來跳出循環(huán),才能正常結(jié)束 run 方法。
(2)線程未處于阻塞狀態(tài)時(shí)
使用 isInterrupted() 判斷線程的中斷標(biāo)志來退出循環(huán)。當(dāng)使用 interrupt() 方法時(shí),中斷標(biāo)志就會(huì)置 true,和使用自定義的標(biāo)志來控制循環(huán)是一樣的道理。
public class ThreadSafe extends Thread { public void run() { while (!isInterrupted()) { //非阻塞過程中通過判斷中斷標(biāo)志來退出 try { Thread.sleep(5*1000); //阻塞過程捕獲中斷異常來退出 } catch (InterruptedException e) { e.printStackTrace(); break; //捕獲到異常之后,執(zhí)行 break 跳出循環(huán) } } } }
3.使用stop方法來結(jié)束線程
public class Main { public static void main(String[] args) throws InterruptedException { MyThread myThread = new MyThread(); myThread.start(); Thread.sleep(3000); // 間隔3秒后 myThread.stop(); // 結(jié)束線程 System.out.println("結(jié)束了"); } }
4.結(jié)束方法的選擇
建議使用標(biāo)志位和interrupt方法來結(jié)束線程,stop方法已經(jīng)不建議再被使用了。
因?yàn)椴捎?stop 是不安全的,主要影響點(diǎn)如下:
- thread.stop() 調(diào)用之后,創(chuàng)建子線程的線程就會(huì)拋出 ThreadDeatherror 的錯(cuò)誤;
- 調(diào)用 stop 會(huì)釋放子線程所持有的所有鎖。導(dǎo)致了該線程所持有的所有鎖的突然釋放(不可控制),那么被保護(hù)數(shù)據(jù)就有可能呈現(xiàn)不一致性。
以上就是Java結(jié)束線程的三種方法及該如何選擇的詳細(xì)內(nèi)容,更多關(guān)于Java 結(jié)束線程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java線程中斷機(jī)制interrupt、isInterrupted、interrupted方法詳解
這篇文章主要介紹了Java線程中斷機(jī)制interrupt、isInterrupted、interrupted方法詳解,一個(gè)線程不應(yīng)該由其他線程來強(qiáng)制中斷或停止,而是應(yīng)該由線程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已經(jīng)被廢棄了,需要的朋友可以參考下2024-01-01SpringBoot RestTemplate GET POST請求的實(shí)例講解
這篇文章主要介紹了SpringBoot RestTemplate GET POST請求的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09使用jaxws建立webservice客戶端并實(shí)現(xiàn)soap消息的handler驗(yàn)證示例
這篇文章主要介紹了使用jaxws建立webservice客戶端并實(shí)現(xiàn)soap消息的handler驗(yàn)證示例,需要的朋友可以參考下2014-03-03Spring中的@Qualifier注解和@Resource注解區(qū)別解析
這篇文章主要介紹了Spring中的@Qualifier注解和@Resource注解區(qū)別解析,@Qualifier注解的用處是當(dāng)一個(gè)接口有多個(gè)實(shí)現(xiàn)的時(shí)候,為了指名具體調(diào)用哪個(gè)類的實(shí)現(xiàn),@Resource注解可以通過 byName命名和byType類型的方式注入,需要的朋友可以參考下2023-11-11Java 實(shí)現(xiàn)限流器處理Rest接口請求詳解流程
在工作中是否會(huì)碰到這樣的場景,高并發(fā)的請求但是無法全部執(zhí)行,需要一定的限流。如果你是使用的微服務(wù)框架,比如SpringCloud,可以使用Gateway增加限流策略來解決。本篇文章是在沒有框架的情況實(shí)現(xiàn)限流器2021-11-11詳解Java中方法重寫與重載的區(qū)別(面試高頻問點(diǎn))
這篇文章主要介紹了Java中方法重寫與重載的區(qū)別(面試高頻問點(diǎn)),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開發(fā)(最新推薦)
本文主要介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開發(fā),感興趣的朋友跟隨小編一起看看吧2024-03-03Java每7天日志自動(dòng)清理的項(xiàng)目實(shí)踐
在實(shí)際項(xiàng)目中由于服務(wù)器內(nèi)存有限,人工清理常會(huì)忘記,本文主要介紹了Java每7天日志自動(dòng)清理的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-014位吸血鬼數(shù)字的java實(shí)現(xiàn)思路與實(shí)例講解
今天小編就為大家分享一篇關(guān)于4位吸血鬼數(shù)字的java實(shí)現(xiàn)思路與實(shí)例講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03