如何使用ExecutorService来处理中止的Runnable?

时间:2012-12-10 22:35:33

标签: java multithreading exception-handling

我有一个Worker类,implements Runnable并且有一个run()方法可以在发生冲突时引发异常并提前返回。当它发生时,需要将该线程放回队列中再次运行。

this问题看,似乎我需要用Callable重写。那是对的吗? Runnable没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

你可以让工作线程自己做。如果你有执行者的控制权。

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

或者你的答案建议让Future的等待线程重新排队。

public void workOrRequeue(){
    for(;;){
       Future<?> future = e.submit(someCallable());
       try{
          future.get();
          return;
       }catch(ExecutionException ex){
          //maybe log, ex.printStackTrace();
       }
    }
}

答案 1 :(得分:2)

正如Future.get()的文档所述:

  

抛出:

     

[...]

     

ExecutionException - 如果计算引发异常