关于java:如何使用ExecutorService来处理中止的Runnable?

How to use ExecutorService to handle an aborted Runnable?

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

从这个问题来看,我似乎需要用Callable重写。对吗?没有办法用Runnable来做这个?


你可以让工作线程自己做。如果你控制了遗嘱执行人。

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
     }
  }
}

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

1
2
3
4
5
6
7
8
9
10
11
public void workOrRequeue(){
    for(;;){
       Future<?> future = e.submit(someCallable());
       try{
          future.get();
          return;
       }catch(ExecutionException ex){
          //maybe log, ex.printStackTrace();
       }
    }
}


Future.get()文件所述:

Throws:

[...]

ExecutionException - if the computation threw an exception