Java多線程編程安全退出線程方法介紹
線程停止
Thread提供了一個(gè)stop()方法,但是stop()方法是一個(gè)被廢棄的方法。為什么stop()方法被廢棄而不被使用呢?原因是stop()方法太過于暴力,會(huì)強(qiáng)行把執(zhí)行一半的線程終止。這樣會(huì)就不會(huì)保證線程的資源正確釋放,通常是沒有給與線程完成資源釋放工作的機(jī)會(huì),因此會(huì)導(dǎo)致程序工作在不確定的狀態(tài)下
那我們?cè)撌褂檬裁磥硗V咕€程呢
Thread.interrupt(),我們可以用他來停止線程,他是安全的,可是使用他的時(shí)候并不會(huì)真的停止了線程,只是會(huì)給線程打上了一個(gè)記號(hào),至于這個(gè)記號(hào)有什么用呢我們可以這樣來用。
public class Mythread extends Thread{
public void run(){
super.run();
for(int i =0 ;i<50000;i++){
if(this.interrupted()){
System.out.println("停止");
break;
}
}
System.out.println("i="+(i+1));
}
}
public class Run{
try{
MyThread thread = new MyThread();
thread.start();
thread.sleep(1000);
thread.interrupt(); //打上標(biāo)記
}catch(Exception e){
System.out.println("main");
e.printStackTrace();
}
System.out.println("end!")
}
雖然這樣就會(huì)停止下來 ,可是For后面的語句還是會(huì)執(zhí)行。
異常法 退出線程
public class Mythread extends Thread{
public void run(){
super.run();
try{
for(int i =0 ;i<50000;i++){
if(this.interrupted()){
System.out.println("停止");
throw new Exception();
}
}
System.out.println("i="+(i+1));
}catch(Exception e){
System.out.println("拋出異常了");
e.printStackTrace();
}
}
}
解釋 如果當(dāng)我們打上了一個(gè)標(biāo)記我們就可以檢測(cè)到已經(jīng)打上的時(shí)候就返回個(gè)true,進(jìn)入if里面返回了一個(gè)異常 這樣就終止了。這樣做使的線程可以在我們可控的范圍里停止
用什么方法去看什么狀態(tài)呢
this.interrupted():看看當(dāng)前線程是否是中斷狀態(tài),執(zhí)行后講狀態(tài)表示改為false this.isInterrupeted():看看線程對(duì)象是否已經(jīng)是中斷狀態(tài),但是不清除中斷狀態(tài)標(biāo)記。
總結(jié)
以上就是本文關(guān)于Java多線程編程安全退出線程方法介紹的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:淺談Java多線程處理中Future的妙用(附源碼)、Java多線程ForkJoinPool實(shí)例詳解等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。下面推薦本站兩本關(guān)于Java編程的書籍,供參考:
Java經(jīng)典實(shí)例(第三版) 完整版 ([美]達(dá)爾文) 中文pdf掃描版
http://www.dhdzp.com/books/577859.html
Java軟件結(jié)構(gòu)與數(shù)據(jù)結(jié)構(gòu)(第4版) (John Lewis) 中文pdf掃描版
http://www.dhdzp.com/books/568505.html
希望對(duì)大家有所幫助!
相關(guān)文章
詳解Java實(shí)現(xiàn)JSONArray轉(zhuǎn)Map的三種實(shí)現(xiàn)方式
本文主要介紹了Java實(shí)現(xiàn)JSONArray轉(zhuǎn)Map的三種實(shí)現(xiàn)方式,本文只是自己常用的三種,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Java實(shí)現(xiàn)開箱即用的redis分布式鎖
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)開箱即用的基于redis的分布式鎖,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以收藏一下2022-12-12
Java如何解析html中的內(nèi)容并存到數(shù)據(jù)庫詳解
最近用到了Java解析Html的一個(gè)庫Jsoup,所以下面這篇文章主要給大家介紹了關(guān)于Java如何解析html中的內(nèi)容并存到數(shù)據(jù)庫的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
JPA如何將查詢結(jié)果轉(zhuǎn)換為DTO對(duì)象
這篇文章主要介紹了JPA如何將查詢結(jié)果轉(zhuǎn)換為DTO對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
springboot項(xiàng)目部署到k8s上的方法步驟
本文主要介紹了springboot項(xiàng)目部署到k8s上的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

