Ⅰ java子線程拋出異常後,怎麼讓主線程隨之結束
子線程執行System.exit(0),會停止主線程。
整個當前java進程會結束。所以進程中的所有線程也會隨時結束。
不過不理解你為什麼需要這種需求,這不是什麼好的處理異常的方式。
Ⅱ java里怎麼理解守護線程在主線程結束後要過一會才結束
一個守護線程什麼時候結束不取決於主線程什麼時候結束。守護線程的作用是在後台運行任務,只要還有一個以上非守護線程沒有結束(即便此時主線程已結束),程序就不會結束。而程序沒結束,守護線程當然還可以繼續運行。
反過來,當所有非守護線程都結束了後,即便還有未結束的守護線程,系統也會馬上結束這些守護線程,然後結束程序。
Ⅲ java 主線程已經執行完了,為什麼子線程還在運行
其實是子線程運行結束後主線程才退出的。因為是子線程開啟後,主線程和子線程的代碼同時繼續運行。當主線程的代碼全部執行完後,若子線程還沒執行完,主線程會等待子線程執行結束後退出程序。
Ⅳ java線程執行完後自己結束嗎
其實最佳答案的說法是有問題的,如果題主指的結束,是指方法塊語句的執行結束的話,熱心網友的說法是對的。但是對於線程本身,所有線程(包括主線程)在啟動後都被CPU參照優先順序交替調用,運行的順序是無法預測的,但最後結束的一定是主線程。
網上有部分說法,展示的代碼運行結果,「主線程先於其他線程結束,並不影響其他線程的運行」只有後半部分是對的。因為方法體(不管是自定義線程的run()還是主線程的main())中全部語句的執行完畢不代表所在線程的結束,可以用activeCount()返回當前運行的匯流排程數來驗證這一點。另外,如果將自定義的線程對象設定為守護線程(setDeamon()),也可以很清楚看到即便main()方法中最後一句輸出語句執行完畢,控制台仍會根據該自定義線程run()方法體的內容繼續輸出,這證明主線程還沒結束——因為當線程組中只剩下守護線程時,JVM虛擬機會自動退出,如果主線程已經結束,唯一活動的線程在被設置成守護線程的情況下,程序會直接結束運行,不可能繼續輸出。
Ⅳ java主線程結束和子線程結束
你應該換成main函數運行,abcd就一定會列印出來了
問題並不是出在主線程和子線程身上,事實上Java似乎也沒有嚴格主線程和子線程的概念,取而代之的是普通線程和後台線程
但是這里你採用@Test來運行代碼,而@Test是JUnit測試框架使用的註解,JUnit在進行單元測試的時候,如果被@Test注釋的方法執行完成,那麼內部開啟的線程也會被強制退出,退出是測試框架進行的操作
這和Java承諾的普通線程不退出程序就不結束是不相符的,如果書上告訴你會輸出兩個但是你執行了只輸出了一個那麼很可能就是這里出了問題
而通過main函數則沒有框架干預,根據Java的規則只要有普通線程沒有退出,程序就不會完全退出(System.exit強制自殺除外),那麼除非創建的線程被設置成了後台線程(或者叫守護線程,daemon),那麼才會在主線程退出時自動關閉這些後台線程,就是你遇到的偶爾可以輸出abcd偶爾不行的效果,否則一定會abcd和efgh兩個都輸出,只不過輸出順序可能不一致
Ⅵ java 創建的線程為什麼會結束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
這代表當該窗口被關閉時,終止JVM運行。連JVM都沒有了,哪來的線程呢?
將此行改為:this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
這代表當該窗口被關閉時,銷毀窗口中的所有資源。
Ⅶ java 主線程結束,子線程會結束嗎
如果你說的是「進程」的話,那麼就會退出。一個進程的退出,那麼其裡面的所有東西都會釋放。 但是,如果你是在一個進程裡面,建立線程P,然後再在線程P裡面創建並且運行線程C1、c2等,那麼,當線程P退出的時候,線程c1 c2是不會退出的。
Ⅷ java線程如何停止
通過調用interrupt方法可以使得處於阻塞狀態的線程拋出一個異常,即interrupt方法可以用來中斷一個正處於阻塞狀態的線程;另外,改方法還會設置線程的中斷狀態(註:isInterrupted()可以用來查詢中斷狀態)。
Ⅸ java多線程中,怎樣知道線程執行結束
在你的主線程中用一個join的方法,你要等待誰,就用誰調用,比如,你要等待線程a結束,就用a.join();這樣就可以了。記住哦,這條語句寫在哪個線程里,哪個線程就要等待調用這個方法的其他線程。就是說,你在主線程里寫了這條語句,那麼主線程就要等待線程a執行完後,主線程才會執行。