temporary_user_name
temporary_user_name

Reputation: 37058

How to use ExecutorService to handle an aborted Runnable?

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?

Upvotes: 5

Views: 852

Answers (2)

John Vint
John Vint

Reputation: 40256

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

Upvotes: 4

millimoose
millimoose

Reputation: 39950

As say the docs for Future.get():

Throws:

[...]

ExecutionException - if the computation threw an exception

Upvotes: 2

Related Questions