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

または、あなたの答えが示唆しているように、Futureの待機中のスレッドを再キューイングします。

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 に答える