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?
java
multithreading
java-8
concurrency
runnable
totothegreat
fuente
fuente
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();
:?Respuestas:
La idea es que las tareas estén empujando a un objeto común TaskCompleteEvent. Si generan un error, el planificador se detiene y todas las tareas se detendrán.
Puede verificar los resultados de cada iteración de tareas en los mapas "errores" y "éxito".
fuente
Solo necesita agregar una tarea adicional cuyo trabajo es monitorear todas las demás tareas en ejecución, y cuando cualquiera de las tareas monitoreadas falla, deben establecer un semáforo (indicador) que el asesino pueda inspeccionar.
fuente
TimerTask
tiene relación alguna con ellaScheduledExecutorService
; Simplemente sucede a implementarRunnable
. Además, no tiene sentido programar una tarea periódica, solo para verificar siConfigurationOptions.getPollingCycleTime()
se ha alcanzado un tiempo particular ( ). Tiene unScheduledExecutorService
, por lo que puede indicarle que programe la tarea correctamente para el tiempo deseado.TimerTask
conRunnable
y que ha solucionado el problema, sin cambiar lo que hace el código. Además, solo useexecutor.schedule(assassin, ConfigurationOptions.getPollingCycleTime(), ChronoUnit.MINUTES);
y se ejecutará una vez en el momento deseado, por lo tanto, laif(LocalDateTime.now().isAfter(death))
verificación es obsoleta. Una vez más, no cambia lo que hace el código, además de hacerlo sustancialmente más simple y más eficiente.