⑴ 為什麼主線程結束,子線程不結束
Thread有守護線程和非守護線程之分。
守護線程在主線程運行結束後,也會結束運行,而非守護線程不會結束。
線程默認都是非守護線程。可以使用thread.setDeamon方法來設置。
system.exit(0); 代表退出進程,無論什麼線程都退出。
下述代碼,即使不加System.exit(0),在主線程結束後,其守護線程也會隨之中止。
public class t {
public static void main(String[] args) {
System.out.println("kaishi");
asd th = new asd();
th.setDaemon(true);
th.start();
System.out.println(System.currentTimeMillis());
System.out.println("tuichu");
System.out.println(Thread.currentThread().getName()+System.currentTimeMillis());
//System.exit(0);
}
}
class asd extends Thread {
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName()+System.currentTimeMillis());
}
}
⑵ java 線程激活和終止,主線程和子線程之間的關系
是一個線程也是一個進程,一個java程序啟動後它就是一個進程,進程相當於一個空盒,它只提供資源裝載的空間,具體的調度並不是由進程來完成的,而是由線程來完成的。一個java程序從main開始之後,進程啟動,為整個程序提供各種資源,而此時將啟動一個線程,這個線程就是主線程,它將調度資源,進行具體的操作。Thread、Runnable的開啟的線程是主線程下的子線程,是父子關系,此時該java程序即為多線程的,這些線程共同進行資源的調度和執行。
⑶ java主線程關閉,其它子線程還能不能運行
public class ThreadTest { static int i=0; public static void main(String[]args){ //建立3個子線程,以i,i,n,m作為子線程是否結束的判斷 //當所有子線程運行完才開始主線程 System.out.println("主線程開始"); Thread t1=new Thread(){
⑷ Java主線程如何等待子線程執行結束
java.util.concurrent.CountDownLatch 這個類可以實現你所要的功能
例如:CountDownLatch latch = new CountDownLatch(5) //聲明計數器為5個
Thread t = new Thread() {
public void run() {
try {
//TODO 你的應用
} catch (Exception e) {
//TODO 異常處理
}
finally {
latch.countDown(); //這句是關鍵
System.out.println("ok"); //5個線程都跑完後輸出
}
}
};
t.start();
然後讓以上操作循環五次(就是說同時開5個線程),那麼這個"ok"就會在等到這5個線程都ok後才會被輸出一次。
⑸ Java父線程停止時如何也將子線程停止
從某種程度上講,做不到。
不管是父線程還是子線程,這只不過是在運行時誰建了誰時用的,一旦所謂的字線程被啟動,這兩個線程是沒有先後貴賤區分的。
任何線程是沒有辦法把另外一個線程終止的。
如果你一定想你說的那樣是線的話,下面是唯一個可行方案。在"父線程"建立「子線程」時,把「父線程」的instance傳過去,在「子線程」里,不停的check"父線程"是否還存活,如果否,停止。
相反的,如果"父線程"需要在"子線程"終了時結束,在"父線程"建立「子線程」時,留住「子線程」的instance然後keep
checking
whether
it's
still
alive.
⑹ java 主線程已經執行完了,為什麼子線程還在運行
其實是子線程運行結束後主線程才退出的。因為是子線程開啟後,主線程和子線程的代碼同時繼續運行。當主線程的代碼全部執行完後,若子線程還沒執行完,主線程會等待子線程執行結束後退出程序。
⑺ java 主線程結束,子線程會結束嗎
如果你說的是「進程」的話,那麼就會退出。一個進程的退出,那麼其裡面的所有東西都會釋放。 但是,如果你是在一個進程裡面,建立線程P,然後再在線程P裡面創建並且運行線程C1、c2等,那麼,當線程P退出的時候,線程c1 c2是不會退出的。
⑻ 主線程什麼都沒做,就會等待子線程結束。這是為什麼
你這個主線程沒有等子線程先執行,主線程幾個字不先打出來嗎,你可以在主線程裡面用 a1.join(); 這樣主線程就會等子線程先執行。
⑼ java主線程結束和子線程結束
你應該換成main函數運行,abcd就一定會列印出來了
問題並不是出在主線程和子線程身上,事實上Java似乎也沒有嚴格主線程和子線程的概念,取而代之的是普通線程和後台線程
但是這里你採用@Test來運行代碼,而@Test是JUnit測試框架使用的註解,JUnit在進行單元測試的時候,如果被@Test注釋的方法執行完成,那麼內部開啟的線程也會被強制退出,退出是測試框架進行的操作
這和Java承諾的普通線程不退出程序就不結束是不相符的,如果書上告訴你會輸出兩個但是你執行了只輸出了一個那麼很可能就是這里出了問題
而通過main函數則沒有框架干預,根據Java的規則只要有普通線程沒有退出,程序就不會完全退出(System.exit強制自殺除外),那麼除非創建的線程被設置成了後台線程(或者叫守護線程,daemon),那麼才會在主線程退出時自動關閉這些後台線程,就是你遇到的偶爾可以輸出abcd偶爾不行的效果,否則一定會abcd和efgh兩個都輸出,只不過輸出順序可能不一致
⑽ java關掉主線程 子線程會關掉嗎
不會的,線程設計的初衷就是相互獨立運行,互相之間不會影響,如果主線程的關閉影響子線程了,那就違背設計的初衷了