Ich benötige einen Dienst, der einige Aufgaben gleichzeitig und im Abstand von 1 Sekunde für 1 Minute ausführt.
Wenn eine der Aufgaben fehlschlägt, möchte ich den Dienst und jede damit ausgeführte Aufgabe mit einer Art Indikator beenden, dass etwas schief gelaufen ist. Wenn andernfalls nach einer Minute alles gut gelaufen ist, wird der Dienst mit einer Anzeige beendet, dass alles gut gelaufen ist.
Zum Beispiel habe ich 2 Funktionen:
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();
Irgendwelche Ideen, wie ich das angehen und die Dinge so allgemein wie möglich gestalten soll?
Math.rand
es nur wenige Dinge, die keine integrierte API sind. Eine Implementierung vonRunnable
muss einevoid run
Definition haben. Art vontask1/2schedule
wäreScheduledFuture<?>
in dem bereitgestellten Kontext. Kommen wir zur eigentlichen Frage: Wie geht es darum, sie zu nutzenawaitTermination
? Sie könnten das als tunscheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);
. Wie wäre es alternativ mit der Überprüfung, ob eine der Aufgaben vor ihrem normalen Abschluss abgebrochen wurde :if (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();
?