2013-12-12 52 views
1

我有多個類型(不同的類)的多個線程。我希望萬一他們中的一個拋出異常並死於被另一個新線程替換。我知道連接線程函數,但是我怎麼去實現它們的5種不同類型的線程,例如在類型1線程模具被立即替換而不必等待類型2首先死亡的情況下。我如何重新生成線程,如果他們死了

這是一些示例僞代碼。

class1 implements runnable{ 
    void run(){ 
    try{ 
     while(true){ 
     repeat task 
     } 
    } catch(Exception e){ 
     log error 
    } 
    } 
} 


class2 implements runnable{ 
    void run(){ 
    try{ 
     while(true){ 
     repeat task 
     } 
    } catch(Exception e){ 
     log error 
    } 
    } 
} 


class3 implements runnable{ 
    void run(){ 
    try{ 
     while(true){ 
     repeat task 
     } 
    } catch(Exception e){ 
     log error 
    } 
    } 
} 

public main(){ 

// start all threads .start() 
} 
+1

別子線程,執行的Runnable,並使用一個Executor(見執行人)執行。 – isnot2bad

+0

@ isnot2bad,我很難理解你的意思。你能舉個例子嗎? – NinjaStars

+0

您可以添加一些代碼,以便我們知道線程在其運行方法中正在做什麼?他們爲什麼會「死」,以及他們死後會發生什麼。 – isnot2bad

回答

3

我希望萬一其中一個引發異常並死於被另一個新線程替換。

我不明白爲什麼你不能這樣做:

public void run() { 
    // only quit the loop if the thread is interrupted 
    while (!Thread.currentThread().isInterrupted()) { 
     try { 
     // do some stuff that might throw 
     repeat task; 
     } catch (Exception e) { 
     // recover from the throw here but then continue running 
     } 
    } 
} 

爲什麼你需要重新啓動一個新的線程?僅僅因爲任務拋出異常並不意味着它以某種方式腐敗,而且需要一個新的適當工作。如果您試圖捕獲全部例外(包括RuntimeException),則catch (Exception e)將執行此操作。如果你想成爲真正仔細你甚至可以趕上Throwable萬一有正在產生Error個機會 - 這是比較少見的。

如果你確實有多個任務(或真的任何時候,你正在處理的線程),你應該考慮使用ExecutorService類。請參閱Java tutorial

// create a thread pool with 10 workers 
ExecutorService threadPool = Executors.newFixedThreadPool(10); 
// or you can create an open-ended thread pool 
// ExecutorService threadPool = Executors.newCachedThreadPool(); 
// define your jobs somehow 
threadPool.submit(new Class1()); 
threadPool.submit(new Class2()); 
... 
// once we have submitted all jobs to the thread pool, it should be shutdown 
threadPool.shutdown(); 

因此,不是分叉線程來完成多個任務,而是啓動一個線程池,並根據需要啓動線程來完成一堆任務。如果一個任務失敗了,你可以確定提交另一個任務到池中,雖然這是一個有點奇怪的模式。

如果要等待所有的任務完成,你會使用:

threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 
+2

這'重新啓動線程'是一個反覆出現的主題。我想知道哪本書/網站從未聽說過循環?這些資源需要在更多的開發者面前消滅。受到感染。 –

+0

不知道@MartinJames。也許是從C那裏記憶可能處於某種不穩定的狀態或什麼東西? – Gray

1
 
     boolean shouldStop() { 
     // it's a good idea to think about how/when to stop ;) 
     return false; 
     } 
     void runThreadGivenType(final Runnable taskToRun) { 
     new Thread() { 
      @Override 
      public void run() { 
      try { 
       taskToRun.run(); 
      } finally { 
       if (!shouldStop()) { 
       runThreadGivenType(taskToRun); 
       } 
      } 
      } 
     }.start(); 
     } 

     public void main(String[] args) throws Exception { 
     runThreadGivenType(new Runnable() { public void run() { System.out.println("I'm almost immortal thread!"); throw new RuntimeException(); } }); 
     TimeUnit.SECONDS.sleep(10); 
     } 

,它是思考執行人管理的線程池太是個好主意。普通的[un/hand]管理線程並不是最佳做法;)

相關問題