主線程和子線程結(jié)束的關(guān)系

線程是一個(gè)動(dòng)態(tài)執(zhí)行的過程,它也有一個(gè)從產(chǎn)生到死亡的過程。

主線程從main()方法開始執(zhí)行,直到main()方法結(jié)束后停止JVM。如果主線程中啟動(dòng)了子線程,默認(rèn)會(huì)等待被啟動(dòng)的所有線程都執(zhí)行完run()方法才終止JVM。

實(shí)際上我們可以通過Thread方法來改變主線程和子線程退出的關(guān)系。

主線程退出時(shí)子線程也退出

????????如果一個(gè)Thread被標(biāo)志位Daemon線程(守護(hù)線程),則所有的非Daemon線程都結(jié)束時(shí),JVM才終止。因?yàn)閺膍ain()方法開始的就是一個(gè)非Daemon線程,我們可以將子進(jìn)程標(biāo)記為Daemon進(jìn)程,這樣主線程退出時(shí),子線程也會(huì)跟著退出。

?????? 默認(rèn)所有從Daemon線程產(chǎn)生的線程也是Daemon線程,在產(chǎn)生這些新線程的線程停止時(shí),也應(yīng)該一并跟著停止。

主線程等待子線程退出

主線程等待啟動(dòng)的子線程都結(jié)束之后再結(jié)束,只需要在主線程流中啟動(dòng)子線程后,子線程實(shí)例調(diào)用join()方法。它的意思是子線程使用join()方法加入至當(dāng)前主線程的流程中,主線程會(huì)等待被加入的線程工作完畢,然后再繼續(xù)它的動(dòng)作。如

??????? public static voidmain(String[] args) {

??????????????????????????? Threadt=new Thread(()->{

???????? //方法操作

});

t.start();

try{

? ? ? ? ? t.join();

}catch(InterruptedException e){

???????? e.printStackTrace();

}

}

?????? 注意join方法需要進(jìn)行異常捕捉,否則編譯報(bào)錯(cuò):

error: unreportedexception InterruptedException; must be caught or declared to be thrown

程序啟動(dòng)后,主線程就開始,在主線程中新建t,并在啟動(dòng)t后,將之加入(join())主線程流程中,所以t會(huì)先執(zhí)行完畢,主線程才會(huì)繼續(xù)原來的流程。

有時(shí)候加入的線程可能處理太久,我們可以設(shè)定該線程的處理時(shí)間,方法就是給join()傳入一個(gè)整數(shù)值n(單位毫秒),表示加入的流程至多可處理n毫秒,過了這個(gè)時(shí)間,即使沒執(zhí)行完,也不理他了,主線程可繼續(xù)執(zhí)行原來的工作流程。

強(qiáng)制退出進(jìn)程

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.exit(0);

線程是屬于進(jìn)程的,線程運(yùn)行在進(jìn)程空間內(nèi),同一進(jìn)程所產(chǎn)生的線程共享同一內(nèi)存空間,當(dāng)進(jìn)程退出時(shí)該進(jìn)程所產(chǎn)生的線程都會(huì)被強(qiáng)制退出并清除。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容