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?
java
multithreading
java-8
concurrency
runnable
totothegreat
quelle
quelle
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();
?Antworten:
Die Idee ist, dass die Aufgaben auf ein gemeinsames Objekt TaskCompleteEvent verschoben werden. Wenn sie einen Fehler auslösen, wird der Scheduler gestoppt und alle Aufgaben werden gestoppt.
Sie können die Ergebnisse jeder Aufgabeniteration in den Karten "Fehler" und "Erfolg" überprüfen.
quelle
Sie müssen nur eine zusätzliche Aufgabe hinzufügen, deren Aufgabe es ist, alle anderen laufenden Aufgaben zu überwachen. Wenn eine der überwachten Aufgaben fehlschlägt, müssen sie ein Semaphor (Flag) setzen, das der Attentäter überprüfen kann.
quelle
TimerTask
hat nichts mit zu tunScheduledExecutorService
; es passiert einfach zu implementierenRunnable
. Außerdem macht es keinen Sinn, eine periodische Aufgabe zu planen, nur um zu überprüfen, ob eine bestimmte Zeit (ConfigurationOptions.getPollingCycleTime()
) erreicht wurde. Sie haben eineScheduledExecutorService
, damit Sie festlegen können, dass die Aufgabe für die gewünschte Zeit richtig geplant werden soll.TimerTask
mitRunnable
und Sie haben das Problem behoben, ohne Änderung , was der Code tut. Verwendenexecutor.schedule(assassin, ConfigurationOptions.getPollingCycleTime(), ChronoUnit.MINUTES);
Sie einfach und es wird einmal zum gewünschten Zeitpunkt ausgeführt, daher ist dieif(LocalDateTime.now().isAfter(death))
Prüfung veraltet. Auch hier ändert sich nichts an der Funktionsweise des Codes, außerdem ist es wesentlich einfacher und effizienter.