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