我需要使用任何Executor
或ExecutorService
执行任务。任务(Callable
或Runnable
)应该无限运行,但是如果有任何异常,应该重新提交给提交任务的线程。
我知道future.get()
会为我抛出ExecutionException
:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(new Task());
future.get();
但是,在阳光灿烂的日子里,我无限期地阻挡了future.get()
,所以我无法使用它。
当底层任务失败时,是否有可能只是抛出异常的Executor
?
答案 0 :(得分: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
}
}