私には、競合が発生した場合に例外を発生させ、早期に戻る可能性のあるメソッドを持っている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-計算で例外がスローされた場合