線程是一個(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)制退出并清除。