Java中線程死亡的幾種情況實(shí)例分析
Java線程會(huì)議如下三種方式結(jié)束,結(jié)束后就處于死亡狀態(tài)
1、run()或者call()方法執(zhí)行完成,線程正常結(jié)束;
2、線程拋出一個(gè)未捕獲的Exception或Error;
3、直接調(diào)用該線程的stop()方法來(lái)結(jié)束該線程;
注意:當(dāng)主線程結(jié)束時(shí),其他線程不受任何影響,并不會(huì)隨之結(jié)束。一旦子線程啟動(dòng)起來(lái)后,它就擁有和主線程相同的地位,不會(huì)受到主線程結(jié)束的影響。
為了測(cè)試某個(gè)線程是否已經(jīng)死亡,可以調(diào)用線程對(duì)象的isAlive()方法,當(dāng)線程處于就緒、運(yùn)行、阻塞三種狀態(tài)時(shí),該方法將返回true;當(dāng)線程處于新建、死亡兩種狀態(tài)時(shí),該方法就返回false。
如下對(duì)線程死亡情況的1和2進(jìn)行測(cè)試。
主線程的代碼如下:
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new RunTask());
t.start();
while (true) {
Thread.sleep(1000);
System.out.println("主線程:子線程狀態(tài)為" + t.isAlive());
}
}
}
測(cè)試1:線程正常結(jié)束后,isAlive()返回False
編寫線程正常結(jié)束的線程執(zhí)行代碼:
public class RunTask implements Runnable {
@Override
public void run() {
for (int idx = 1; idx <= 10; idx++) {
System.out.println("子線程:我還活著" + idx);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
兩個(gè)線程的輸出結(jié)果如下所示,顯示子線程正常執(zhí)行結(jié)束后,使用Thread.isAlive()就返回False了。
主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 子線程:我還活著8 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 子線程:我還活著9 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 子線程:我還活著10 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為false 主線程:子線程狀態(tài)為false 主線程:子線程狀態(tài)為false 主線程:子線程狀態(tài)為false 主線程:子線程狀態(tài)為false
測(cè)試2:子線程拋出異常之后,線程的isAlive()返回False
修改子線程的代碼,加入異常拋出:
public class RunTask implements Runnable {
@Override
public void run() {
for (int idx = 1; idx <= 10; idx++) {
System.out.println("子線程:我還活著" + idx);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (idx == 5) {
throw new RuntimeException("i am die");
}
}
}
}
再次執(zhí)行,觀察輸出:
主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 子線程:我還活著4 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 子線程:我還活著5 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true 主線程:子線程狀態(tài)為true Exception in thread "Thread-0" java.lang.RuntimeException: i am die at RunTask.run(RunTask.java:15) at java.lang.Thread.run(Thread.java:662) 主線程:子線程狀態(tài)為false 主線程:子線程狀態(tài)為false 主線程:子線程狀態(tài)為false
可以看到,拋出異常后,子線程直接終止,變成了Flase狀態(tài);
總結(jié)
線程正常結(jié)束后或者線程拋出了未捕獲的異常,線程變成死亡狀態(tài),使用isAlive()函數(shù)返回False。好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
MyBatis連接數(shù)據(jù)庫(kù)配置的基本步驟和機(jī)制
MyBatis 是一個(gè)流行的持久層框架,它通過(guò)使用XML或注解的方式將SQL語(yǔ)句、存儲(chǔ)過(guò)程和Java方法進(jìn)行綁定,從而避免了手寫大量的JDBC代碼和手動(dòng)設(shè)置參數(shù)與結(jié)果集,本文給大家介紹了MyBatis連接數(shù)據(jù)庫(kù)配置的基本步驟和機(jī)制,需要的朋友可以參考下2024-05-05
使用@CachePut?更新數(shù)據(jù)庫(kù)和更新緩存
這篇文章主要介紹了使用@CachePut?更新數(shù)據(jù)庫(kù)和更新緩存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Springboot項(xiàng)目基于Devtools實(shí)現(xiàn)熱部署步驟詳解
這篇文章主要介紹了Springboot項(xiàng)目基于Devtools實(shí)現(xiàn)熱部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
RabbitMQ延遲隊(duì)列及消息延遲推送實(shí)現(xiàn)詳解
這篇文章主要介紹了RabbitMQ延遲隊(duì)列及消息延遲推送實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
java中的Io(input與output)操作總結(jié)(二)
這一節(jié)我們來(lái)討論關(guān)于文件自身的操作包括:創(chuàng)建文件對(duì)象、創(chuàng)建和刪除文件、文件的判斷和測(cè)試、創(chuàng)建目錄、獲取文件信息、列出文件系統(tǒng)的根目錄、列出目錄下的所有文件,等等,感興趣的朋友可以了解下2013-01-01
Java?方法(方法的定義,可變參數(shù),參數(shù)的傳遞問(wèn)題,方法重載,方法簽名)
這篇文章主要介紹了Java?方法(方法的定義,可變參數(shù),參數(shù)的傳遞問(wèn)題,方法重載,方法簽名),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09

