我有一个Worker
类,implements Runnable
并且有一个run()
方法可以在发生冲突时引发异常,并提前返回。当它发生时,该线程需要放回队列中才能再次运行。
从这个问题来看,似乎我需要用Callable
. 那是对的吗?有没有办法做到这一点Runnable
?
我有一个Worker
类,implements Runnable
并且有一个run()
方法可以在发生冲突时引发异常,并提前返回。当它发生时,该线程需要放回队列中才能再次运行。
从这个问题来看,似乎我需要用Callable
. 那是对的吗?有没有办法做到这一点Runnable
?
那么你可以让工作线程自己做。如果你有执行人的控制权。
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;
}
}
}
或者正如您的回答所暗示的那样,等待未来重新排队的线程。
public void workOrRequeue(){
for(;;){
Future<?> future = e.submit(someCallable());
try{
future.get();
return;
}catch(ExecutionException ex){
//maybe log, ex.printStackTrace();
}
}
}
正如文档所说Future.get()
:
抛出:
[...]
ExecutionException
- 如果计算抛出异常