私には、競合が発生した場合に例外を発生させ、早期に戻る可能性のあるメソッドを持っているWorker
クラスがimplements Runnable
あります。run()
その場合、そのスレッドをキューに戻して再度実行する必要があります。
この質問を見ると、で書き直す必要があるようCallable
です。あれは正しいですか?これを行う方法はありませんRunnable
か?
私には、競合が発生した場合に例外を発生させ、早期に戻る可能性のあるメソッドを持っているWorker
クラスがimplements Runnable
あります。run()
その場合、そのスレッドをキューに戻して再度実行する必要があります。
この質問を見ると、で書き直す必要があるようCallable
です。あれは正しいですか?これを行う方法はありませんRunnable
か?
さて、あなたはワーカースレッドにそれを自分でやらせることができます。エグゼキュータを制御できる場合。
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();
}
}
}
のドキュメントを言うようにFuture.get()
:
スロー:
[...]
ExecutionException
-計算で例外がスローされた場合