I have a Worker
class that implements Runnable
and has a run()
method which may raise exceptions in the event of a conflict, and return early. When it does, that thread needs to be put back into the queue to be run again.
From looking at this question, it seems I need to rewrite with Callable
. Is that correct? There's no way to do this with Runnable
?
Well you can have the worker thread do it itself. If you have control of the executor.
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;
}
}
}
Or as your answer suggests having the waiting thread of a Future re-queue.
public void workOrRequeue(){
for(;;){
Future<?> future = e.submit(someCallable());
try{
future.get();
return;
}catch(ExecutionException ex){
//maybe log, ex.printStackTrace();
}
}
}
As say the docs for Future.get()
:
Throws:
[...]
ExecutionException
- if the computation threw an exception
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With