我有一个Worker
类,implements Runnable
并且有一个run()
方法可以在发生冲突时引发异常并提前返回。当它发生时,需要将该线程放回队列中再次运行。
从this问题看,似乎我需要用Callable
重写。那是对的吗? Runnable
没有办法做到这一点?
答案 0 :(得分:4)
你可以让工作线程自己做。如果你有执行者的控制权。
class RequeableWorker implement Runnable{
private final ExecutorService e;
public RequeableWorker(ExecutorService e){this.e =e;}
public void run(){
try{
//do work
}catch(RuntimeException ex){
e.submit(this);
throw ex;
}
}
}
或者你的答案建议让Future的等待线程重新排队。
public void workOrRequeue(){
for(;;){
Future<?> future = e.submit(someCallable());
try{
future.get();
return;
}catch(ExecutionException ex){
//maybe log, ex.printStackTrace();
}
}
}
答案 1 :(得分:2)
正如Future.get()
的文档所述:
抛出:
[...]
ExecutionException
- 如果计算引发异常