How to use ExecutorService to handle an aborted Runnable?

exception, java, multithreading

Solution

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();
       }
    }
}

Problem

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`?

Original source

Related problems