2016-08-21 31 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 
      } 
    }