㈠ 怎麼知道java多線程都已經運行結束
可以設置一個map對象
key為fileName,value
為boolean
結束了就設置為true,沒結束就設置為false
然後while循環
直到map中所有的value都為true時才break;
執行你所說的語句!
㈡ 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 如何判斷線程池所有任務是否執行完畢
調用shutdown(),線程池就會不再接受任務。
然後調用public boolean awaitTermination(long timeout,
TimeUnit unit)
等待所有任務執行完畢,執行完畢返回true或者超時返回false。
㈣ java 主線程已經執行完了,為什麼子線程還在運行
其實是子線程運行結束後主線程才退出的。因為是子線程開啟後,主線程和子線程的代碼同時繼續運行。當主線程的代碼全部執行完後,若子線程還沒執行完,主線程會等待子線程執行結束後退出程序。
㈤ java 線程執行完 會自動關閉嗎
如果代碼該
thread線程中的代碼執行結束就會關閉,但是如果該線程代碼未執行完畢,即時主線程關閉,該線程也不會關閉
㈥ 如何正確結束Java線程
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。
1. 使用退出標志終止線程
當run方法執行完後,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監聽客戶端請求,或是其他的需要循環處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標志,並通過設置這個標志為true或false來控制while循環是否退出。下面給出了一個利用退出標志終止線程的例子。
package chapter2;
public class ThreadFlag extends Thread
{
public volatile boolean exit = false;
public void run()
{
while (!exit);
}
public static void main(String[] args) throws Exception
{
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主線程延遲5秒
thread.exit = true; // 終止線程thread
thread.join();
System.out.println("線程退出!");
}
}
在上面代碼中定義了一個退出標志exit,當exit為true時,while循環退出,exit的默認值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值,
2. 使用stop方法終止線程
使用stop方法可以強行終止正在運行或掛起的線程。我們可以使用如下的代碼來終止線程:
thread.stop();
雖然使用上面的代碼可以終止線程,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程序關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止線程。
3. 使用interrupt方法終止線程
使用interrupt方法來終端線程可分為兩種情況:
(1)線程處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}來判斷線程是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將拋出一個InterruptedException例外,而在第二種情況下線程將直接退出。下面的代碼演示了在第一種情況下使用interrupt方法。
package chapter2;
public class ThreadInterrupt extends Thread
{
public void run()
{
try
{
sleep(50000); // 延遲50秒
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws Exception
{
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println("在50秒之內按任意鍵中斷線程!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("線程已經退出!");
}
}
上面代碼的運行結果如下:
在50秒之內按任意鍵中斷線程!
sleep interrupted
線程已經退出!
在調用interrupt方法後, sleep方法拋出異常,然後輸出錯誤信息:sleep interrupted.
注意:在Thread類中有兩個方法可以判斷線程是否通過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他線程是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。
㈦ 如何判斷java多線程是否全部執行完了,並計
思路: 把所有的線程都放到線程池裡面
步驟:
1: 創建線程池 ExecutorService cachedThreadPool
2: 開啟一個線程 cachedThreadPool.execute(new Runnable() {//做任務})
3.: 判斷線程池裡面是否執行完, cachedThreadPool.isTerminated()
while (true) {
if (cachedThreadPool.isTerminated()) { // 計算耗時
long time = System.currentTimeMillis() - start;
System.out.println("["+Utils.getNowTime()+"]:" + "程序結束了,總耗時:" + time + " ms(毫秒)!\n");
break;
}
}
㈧ java線程執行完後自己結束嗎
其實最佳答案的說法是有問題的,如果題主指的結束,是指方法塊語句的執行結束的話,熱心網友的說法是對的。但是對於線程本身,所有線程(包括主線程)在啟動後都被CPU參照優先順序交替調用,運行的順序是無法預測的,但最後結束的一定是主線程。
網上有部分說法,展示的代碼運行結果,「主線程先於其他線程結束,並不影響其他線程的運行」只有後半部分是對的。因為方法體(不管是自定義線程的run()還是主線程的main())中全部語句的執行完畢不代表所在線程的結束,可以用activeCount()返回當前運行的匯流排程數來驗證這一點。另外,如果將自定義的線程對象設定為守護線程(setDeamon()),也可以很清楚看到即便main()方法中最後一句輸出語句執行完畢,控制台仍會根據該自定義線程run()方法體的內容繼續輸出,這證明主線程還沒結束——因為當線程組中只剩下守護線程時,JVM虛擬機會自動退出,如果主線程已經結束,唯一活動的線程在被設置成守護線程的情況下,程序會直接結束運行,不可能繼續輸出。
㈨ java多線程中,怎樣知道線程執行結束
在你的主線程中用一個join的方法,你要等待誰,就用誰調用,比如,你要等待線程a結束,就用a.join();這樣就可以了。記住哦,這條語句寫在哪個線程里,哪個線程就要等待調用這個方法的其他線程。就是說,你在主線程里寫了這條語句,那麼主線程就要等待線程a執行完後,主線程才會執行。
㈩ java 如何判斷一個線程結束
線程結束時等待也就結束了
------解決方案--------------------------------------------------------
waitforsingleobject當然可以。
或者設一全局變數,線程結束就將其置為某值。在別處讀取該值,就可以判斷線程是否結束了。
------解決方案--------------------------------------------------------
wait_object_0
表示這個線程已經退出了,wait_timeout是這個線程在此函數返回時候還沒退出,但是設置的等待時間已經到了,wait_abandoned是所等待的對象是mutex而非thread,