Мне нужен какой-то сервис, который будет запускать несколько задач одновременно и с интервалом в 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();
Любые идеи о том, как я должен заняться этим и сделать вещи как можно более общими?
java
multithreading
java-8
concurrency
runnable
totothegreat
источник
источник
Math.rand
не является встроенным API. РеализацияRunnable
должна иметьvoid run
определение. Типtask1/2schedule
будетScheduledFuture<?>
в предоставленном контексте. Переходя к актуальному вопросу, как это использоватьawaitTermination
? Вы могли бы сделать это какscheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);
. Кроме того , что о проверке , если любой из задач , был отменен до его нормального завершения:if (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();
?Ответы:
Идея состоит в том, что задачи проталкиваются к общему объекту TaskCompleteEvent. Если они выдвигают ошибку, планировщик останавливается, и все задачи останавливаются.
Вы можете проверить результаты каждой итерации задачи в картах «ошибки» и «успех».
источник
Вам просто нужно добавить дополнительную задачу, задачей которой является наблюдение за всеми остальными запущенными задачами - и, когда любая из отслеживаемых задач дает сбой, им необходимо установить семафор (флаг), который ассасин может проверять.
источник
TimerTask
совершенно не связан сScheduledExecutorService
; это просто случилось, чтобы реализоватьRunnable
. Кроме того, нет смысла планировать периодическую задачу, просто чтобы проверить, было ли достигнуто определенное время (ConfigurationOptions.getPollingCycleTime()
). У вас естьScheduledExecutorService
, так что вы можете сказать ему, чтобы запланировать задачу прямо на желаемое время.TimerTask
на,Runnable
и вы исправили проблему, не меняя того, что делает код. Кроме того, просто используйте,executor.schedule(assassin, ConfigurationOptions.getPollingCycleTime(), ChronoUnit.MINUTES);
и он будет запущен один раз в нужное время, следовательно,if(LocalDateTime.now().isAfter(death))
проверка устарела. Опять же, это не меняет того, что делает код, кроме того, что делает его существенно проще и эффективнее.