2014-12-03 51 views
1

我使用ExecutorService來執行我的邏輯。如下所示,run方法應該在無限循環中執行。簡而言之,run方法是一個消息使用者,它應該從隊列中移除消息並處理消息。但是,doSomething()方法遇到一個異常,並且永遠不會返回。經過分析,我意識到doSomething()方法中有一個NullPointer。雖然我已經處理了這個異常,但我如何確保循環永遠不會終止 - 儘管有任何運行時異常。我無法承擔我的Runnable任務無法工作。它會停止整個功能。從ExecutorService中的異常中恢復

ExecutorService service = Executors.newSingleThreadExecutor() 
    service.submit(new Runnable(){ 
     public void run(){ 
      while(true){ 
      doSomething(); 
     } 
    } 
    }) 
+1

好像ExecutorService的濫用。爲什麼不創建自己的線程? – dnault 2014-12-03 10:47:30

+0

@dnault爲什麼這是一個濫用?這不是一種更好的做事方式嗎? – 2014-12-03 11:14:38

+0

也許「濫用」太過分了。但是ExecutorService在這裏沒有添加任何值。當你需要運行幾個任務時,ExecutorService通常被用作抽象,並且提交任務給服務的代碼並不關心它們如何執行的細節。但是在這裏你有一個永遠循環的單一任務。任何試圖向執行者提交其他任務的嘗試都將永遠阻塞,因爲循環任務從未結束。 – dnault 2014-12-03 21:19:39

回答

2

試試你的循環內捕獲異常象下面這樣:

ExecutorService service = Executors.newSingleThreadExecutor(); 
service.submit(new Runnable(){ 
    public void run(){ 
     while(true){ 
     try { 
      doSomething(); 
     } catch (Exception e) { 
      //log exception etc... 
     } 
    } 
} 
}); 
1

只是圍繞運行方法的內容與try/catch捕獲每個異常。

ExecutorService service = Executors.newSingleThreadExecutor() 
    service.submit(new Runnable(){ 
     public void run(){ 
      while(true){ 
      try { 
       doSomething(); 
      } catch (Exception e) { 
       handleException(); 
      } 
     } 
    } 
    })