How to use ExecutorService to handle an aborted Runnable?
我有一个Worker类,它是implements Runnable类,它有一个run()方法,可以在发生冲突时引发异常,并提前返回。完成后,需要将该线程放回队列中,以便再次运行。
从这个问题来看,我似乎需要用Callable重写。对吗?没有办法用Runnable来做这个?
- 只是使用docs.oracle.com JavaSE / 7 /文档/ / / / /使用API的Java并行/ & hellip;
- 我已经读这。它的方法和类型的列表和所有但不给任何人或任何事或说一个runnables异常处理。我编辑的问题是明确的。
- 所以,你可以看看在这
- 你会是一个Runnable抛出未捕获的异常在运行时不会被返回到池?
- 这部分我的run()自然法:try{//thingThatThrowsException}catch (TransactionAbortException e){return;}我害怕,是的,如果它返回这里,运行不做它的工作。
- 如果你在Runnable处理例外,它为什么不在游泳池里游泳吗?
你可以让工作线程自己做。如果你控制了遗嘱执行人。
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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 ;
}
}
} |
或者,正如您的回答所建议的那样,让未来的重新排队等待线程。
1 2 3 4 5 6 7 8 9 10 11
| public void workOrRequeue(){
for(;;){
Future<?> future = e.submit(someCallable());
try{
future.get();
return;
}catch(ExecutionException ex){
//maybe log, ex.printStackTrace();
}
}
} |
- …你能做到吗?那会有用吗?如果我在主线程中声明一个ExecutorService,我可以将其作为参数传递给工作线程,并让工作线程将自己重新提交到队列中?
- 如果工人接受其他论点怎么办?当它重新提交到队列时,它们也将包括在新提交中吗?
- @一般来说,执行器服务由一个工作队列和线程组成。如果传递ExecutorService并提交给它,那么只需将runnable放在ES工作队列上。它只是委托,您可以看到它在这里也做了DOCS.Oracle .com /JavaSe/1.5.0/DOCS/API/Java/UTL/Orthy//Helip;
- 这带来了另一种问题。如果需要重新定义工作人员,则需要考虑让ES在检索新数据时做太多的工作。如果ES不能真正获得这些新数据,您需要使用我列出的第二个示例。最后,如果需要的工作人员实际上能够获得新的参数,那么您可以在submit之前得到它们。
如Future.get()文件所述:
Throws:
[...]
ExecutionException - if the computation threw an exception