Preciso de algum tipo de serviço que execute algumas tarefas simultaneamente e em um intervalo de 1 segundo por 1 minuto.
Se uma das tarefas falhar, quero interromper o serviço e todas as tarefas executadas com algum tipo de indicador de que algo deu errado; caso contrário, após um minuto tudo correu bem, o serviço será interrompido com um indicador de que tudo correu bem.
Por exemplo, eu tenho 2 funções:
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();
Alguma idéia de como devo lidar com isso e tornar as coisas o mais genéricas possível?
Math.rand
não é uma API interna. Uma implementação deRunnable
deve ter umavoid run
definição. O tipo detask1/2schedule
estariaScheduledFuture<?>
no contexto fornecido. Passando para a pergunta real, como ela é usadaawaitTermination
? Você poderia fazer isso comoscheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);
. Como alternativa, que tal verificar se alguma das tarefas foi cancelada antes de sua conclusão normalif (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();
:?