正常に終了したタスクをキューに再度実行する必要があります (ある種のループ)。afterExecute メソッドをオーバーライドして getQueue().offer(runnable); を呼び出すだけでよいですか。? スレッドの同期が心配です、ありがとう。
2 に答える
エグゼキューターは、繰り返したいタスクだけでなく、さまざまなタスクを実行できます。したがって、オーバーライドする afterExecute メソッドでは、完了したタスクが繰り返されるタスクであるかどうかを判断する必要があります。その結果、実行者は特定のタスクを認識します。これは悪いデザインです、INHO。
ScheduledThreadPoolExecutor.scheduleWithFixedDelay() の使用を検討してください。ただし、delay>0 である必要がありますが、delay を 1 ナノ秒に設定できます。
別のオプション (私が好む) は、ネストされたタスクが正しく終了した場合に再送信する別の Runnable でタスクをラップすることです。
あなたが提案するものに問題があってはなりません。ただし、 を呼び出すのではなく、executor サービスをgetQueue().offer()
呼び出すだけです。submit()
また、は保護されたメソッドであるため、 ?afterExecute
のサブクラスを作成したと仮定します。ThreadPoolExecutorService
必ずメソッドを呼び出しsuper.afterExecute()
てくださいafterExecute
。
個人的には、Runnables をサービスに配置する役割を担うサブミッター クラスのアイデアが気に入っています。コールバックを使用して、実行が完了したときにサブミッターに通知し (おそらく a のCallable
代わりに aを使用Runnable
)、サブミッターはタスクを再サブミットする必要があるかどうかを判断します。これは、将来の懸念の分離からうまく機能します。
最後に、@Alexei の提案は、サブクラス化のより標準的な代替手段として検討するのにおそらく良いものThreadPoolExecutorService
です。