Java結(jié)束線程的三種方法及該如何選擇
java常用的結(jié)束一個運行中的線程的方法有3中:使用退出標志,使用interrupt方法,使用stop方法。
1.使用退出標志
即在線程內(nèi)部定義一個bool變量來判斷是否結(jié)束當前的線程:
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方法中的一個while循環(huán)中,而由這個bool變量來對while循環(huán)進行控制。
2.使用interrupt方法
這種方法需要判斷當前的線程所處于的狀態(tài):
(1)當前線程處于阻塞狀態(tài)時
線程處于阻塞狀態(tài)一般是在使用了 sleep,同步鎖的 wait,socket 中的 receiver,accept 等方法時,會使線程處于阻塞狀態(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é)束線程的時候,一定要先捕獲 InterruptedException 異常之后通過 break 來跳出循環(huán),才能正常結(jié)束 run 方法。
(2)線程未處于阻塞狀態(tài)時
使用 isInterrupted() 判斷線程的中斷標志來退出循環(huán)。當使用 interrupt() 方法時,中斷標志就會置 true,和使用自定義的標志來控制循環(huán)是一樣的道理。
public class ThreadSafe extends Thread { public void run() { while (!isInterrupted()) { //非阻塞過程中通過判斷中斷標志來退出 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é)束方法的選擇
建議使用標志位和interrupt方法來結(jié)束線程,stop方法已經(jīng)不建議再被使用了。
因為采用 stop 是不安全的,主要影響點如下:
- thread.stop() 調(diào)用之后,創(chuàng)建子線程的線程就會拋出 ThreadDeatherror 的錯誤;
- 調(diào)用 stop 會釋放子線程所持有的所有鎖。導(dǎo)致了該線程所持有的所有鎖的突然釋放(不可控制),那么被保護數(shù)據(jù)就有可能呈現(xiàn)不一致性。
以上就是Java結(jié)束線程的三種方法及該如何選擇的詳細內(nèi)容,更多關(guān)于Java 結(jié)束線程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java線程中斷機制interrupt、isInterrupted、interrupted方法詳解
這篇文章主要介紹了Java線程中斷機制interrupt、isInterrupted、interrupted方法詳解,一個線程不應(yīng)該由其他線程來強制中斷或停止,而是應(yīng)該由線程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已經(jīng)被廢棄了,需要的朋友可以參考下2024-01-01SpringBoot RestTemplate GET POST請求的實例講解
這篇文章主要介紹了SpringBoot RestTemplate GET POST請求的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09使用jaxws建立webservice客戶端并實現(xiàn)soap消息的handler驗證示例
這篇文章主要介紹了使用jaxws建立webservice客戶端并實現(xiàn)soap消息的handler驗證示例,需要的朋友可以參考下2014-03-03Spring中的@Qualifier注解和@Resource注解區(qū)別解析
這篇文章主要介紹了Spring中的@Qualifier注解和@Resource注解區(qū)別解析,@Qualifier注解的用處是當一個接口有多個實現(xiàn)的時候,為了指名具體調(diào)用哪個類的實現(xiàn),@Resource注解可以通過 byName命名和byType類型的方式注入,需要的朋友可以參考下2023-11-11Java 實現(xiàn)限流器處理Rest接口請求詳解流程
在工作中是否會碰到這樣的場景,高并發(fā)的請求但是無法全部執(zhí)行,需要一定的限流。如果你是使用的微服務(wù)框架,比如SpringCloud,可以使用Gateway增加限流策略來解決。本篇文章是在沒有框架的情況實現(xiàn)限流器2021-11-11如何設(shè)置IDEA遠程連接服務(wù)器開發(fā)環(huán)境并結(jié)合cpolar實現(xiàn)ssh遠程開發(fā)(最新推薦)
本文主要介紹如何在IDEA中設(shè)置遠程連接服務(wù)器開發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實現(xiàn)無公網(wǎng)遠程連接,然后實現(xiàn)遠程Linux環(huán)境進行開發(fā),感興趣的朋友跟隨小編一起看看吧2024-03-034位吸血鬼數(shù)字的java實現(xiàn)思路與實例講解
今天小編就為大家分享一篇關(guān)于4位吸血鬼數(shù)字的java實現(xiàn)思路與實例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03