いくつかのタスクを同時に、1秒の間隔で1分間実行するある種のサービスが必要です。
タスクの1つが失敗した場合、サービスとそれとともに実行されたすべてのタスクを何らかの問題が発生したことを示すインジケーターで停止します。それ以外の場合は、1分後にすべてがうまくいった場合、サービスはすべて正常に終了したことを示すインジケーターで停止します。
たとえば、私は2つの機能があります:
Runnable task1 = ()->{
int num = Math.rand(1,100);
if (num < 5){
throw new Exception("something went wrong with this task,terminate");
}
}
Runnable task2 = ()->{
int num = Math.rand(1,100)
return num < 50;
}
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
task1schedule = scheduledExecutorService.scheduleAtFixedRate(task1, 1, 60, TimeUnit.SECONDS);
task2schedule = scheduledExecutorService.scheduleAtFixedRate(task2, 1, 60, TimeUnit.SECONDS);
if (!task1schedule || !task2schedule) scheduledExecutorService.shutdown();
これにどのように取り組み、可能な限り一般的なものにするかについてのアイデアはありますか?
タスクを毎分繰り返すようにスケジュールするのは意味がありませんが、「1分後にすべてがうまくいった場合は」タスクを停止したいとします。どちらの場合もexecutorを停止しているため、1分後にexecutorをシャットダウンするタスクをスケジュールするのは簡単です。そして、先物は何かがうまくいかなかったかをすでに示しています。他にどのような種類のインジケーターが必要かは言いませんでした。
—
ホルガー
Math.randは別に、組み込みAPI ではありません。の実装にRunnableはvoid run定義が必要です。タイプはtask1/2scheduleなりScheduledFuture<?>提供されるコンテキストで。実際の質問に移りますが、それをどのように活用するのawaitTerminationですか?あなたはそれをとして行うことができますscheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);。または、通常の完了前にキャンセルされたタスクがあるかどうかを確認するのはどうif (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();ですか?