5

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

这个问题来看,似乎我需要用Callable. 那是对的吗?有没有办法做到这一点Runnable

4

2 回答 2

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

或者正如您的回答所暗示的那样,等待未来重新排队的线程。

public void workOrRequeue(){
    for(;;){
       Future<?> future = e.submit(someCallable());
       try{
          future.get();
          return;
       }catch(ExecutionException ex){
          //maybe log, ex.printStackTrace();
       }
    }
}
于 2012-12-10T22:53:26.733 回答
2

正如文档所说Future.get()

抛出:

[...]

ExecutionException- 如果计算抛出异常

于 2012-12-10T22:46:03.607 回答