2016-08-21 50 views
0

我需要使用任何ExecutorExecutorService執行任務。任務(CallableRunnable)應該無限運行,但如果發生任何異常,應該將其重新提交給提交任務的線程。重新引發異常的ExecutorService

我知道future.get()會拋出ExecutionException對我來說:

ExecutorService executor = Executors.newSingleThreadExecutor(); 
    Future<?> future = executor.submit(new Task()); 
    future.get(); 

然而,在晴天的情況我就future.get()無限期地阻塞,所以我不能使用它。

有可能有任何Executor只是當底層任務失敗時拋出異常?

回答

1

我不認爲有可能通過簡單地使用Executors來做到這一點。
您可以考慮在Task中使用try-catch塊,並將該異常添加到catch塊中的隊列中。

try{ 
    //perform task 
    }catch(Exception e){ 
    queue.offer(e) 
    } 

創建一個從隊列中讀取異常的線程。

public void run() { 
     Exception e; 
      try { 
        e = q.take(); 
        e.printStackTrace(); 
      } catch (InterruptedException e1) { 
        // TODO Auto-generated catch block 
      } 
    }