2015-04-06 16 views
0

有兩個或多個線程:主要和幾個孩子。孩子是工作者,主要控制孩子的活力。一旦主線程檢測到一個子線程死了,它就會創建新的線程。如何控制Java中的線程活躍度?

目前我不能想象更好的解決方案比檢查在循環中的每個線程t.isAlive()但衆所周知的是,開發人員應避免輪詢不惜任何代價。

注意。工作者線程可以等待HTTP響應幾分鐘(getInputStream()URLConnection

UPDATE

工人沒有完成它的工作之後卻收到迴應或者超時它創建服務器響應新的連接,並等待再次。

+1

我不明白:如果你想重建具有相同functionallity線程,爲什麼你允許線程死亡? – Andremoniy 2015-04-06 06:47:19

+0

例如,我無法修復第三方代碼中的未捕獲異常。 – gumkins 2015-04-06 06:50:47

+0

在這種情況下,您可以始終將此線程包裝到另一個線程中,並在新的線程包裝器中執行控制 – Andremoniy 2015-04-06 06:53:38

回答

0

根據您的問題和評論我們的「對話」的目的,我建議你下面這個簡單的想法。

如果要重建具有相同functionallity線程

,你爲什麼允許線程死嗎?

如果你有,像你說的,3 d黨線程實現,你可以用它們變成另外一個線程,不要讓它們死亡。

考慮,3 d黨Thread實現被稱爲ThirdPartyThread類。所以,不是檢查他們與.isAlive()狀態,只是把它包裝成另一個線程與try ... catch

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     do { 
     try { 
      new ThirdPartyThread().run(); 
     } catch (Throwable t) { 
      // you can vary behaviour here with different classes of exceptions. 
      // But main idea is to catch their death and go on 
     } 
     } while (true); // instead of `true` you can use your specific condition 
    } 
}).start(); 
1

,如果你並不真的需要,否則不要使用低級別線程的方法。相反,使用Java Concurrency API。對於你的情況,我會使用一個線程池來控制線程。如果一個線程完成它的工作,它將返回到池中而不是真正死亡。

+0

通常情況下,永遠在循環中完成他們的工作。 – gumkins 2015-04-06 07:35:40

0

Andremoniy:如果你想用相同的函數重新創建線程,爲什麼你允許線程死掉?

gumkins:例如,我無法修復第三方代碼中的未捕獲異常。

如果抓住異常並且繼續在同一個線程中運行是沒有意義的,那麼啓動一個新線程來取代舊線程的位置是沒有任何意義的。開始一個新的線程完成沒有什麼

所有線程共享相同的堆和相同的全局狀態。如果庫在靜態變量或單例對象中保持全局狀態,那麼同一個狀態將在每個線程中可見。如果全局狀態在發生某種異常後中斷/無效,那麼它將在每個線程的中無效/中斷。 (這包括任何線程損害造成了後,你的程序造成的。)


順便說一句,你是想在這裏重新發明了一個名字輪:這就是所謂的「線程池。「

Java標準庫提供了許多不同種類的線程池的所有實現java.util.concurrent.ExecutorService接口的你應該看看