Necesito algún tipo de servicio que ejecute algunas tareas simultáneamente y en un intervalo de 1 segundo durante 1 minuto.
Si una de las tareas falla, quiero detener el servicio y cada tarea que se ejecutó con algún tipo de indicador de que algo salió mal, de lo contrario, si después de un minuto todo salió bien, el servicio se detendrá con un indicador de que todo salió bien.
Por ejemplo, tengo 2 funciones:
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();
¿Alguna idea sobre cómo debería abordar esto y hacer que las cosas sean lo más genéricas posible?
Math.rand
no es una API incorporada. Una implementación deRunnable
debe tener unavoid run
definición. Tipo detask1/2schedule
estaríaScheduledFuture<?>
en el contexto proporcionado. Pasando a la pregunta real, ¿cómo se utilizaawaitTermination
? Podrías hacer eso comoscheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);
. Alternativamente, ¿qué pasa con verificar si alguna de las tareas se canceló antes de su finalización normalif (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();
:?