Ho bisogno di un tipo di servizio che eseguirà alcune attività contemporaneamente e in un intervallo di 1 secondo per 1 minuto.
Se una delle attività fallisce, desidero interrompere il servizio e tutte le attività che lo hanno eseguito con una sorta di indicatore che qualcosa è andato storto, altrimenti se dopo un minuto tutto è andato bene il servizio si fermerà con un indicatore che tutto è andato bene.
Ad esempio, ho 2 funzioni:
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();
Qualche idea su come dovrei affrontarlo e rendere le cose il più generiche possibile?
Math.rand
non è un'API integrata. Un'implementazione diRunnable
deve avere unavoid run
definizione. Il tipo ditask1/2schedule
sarebbeScheduledFuture<?>
nel contesto fornito. Passando alla domanda vera e propria, come può essere utilizzataawaitTermination
? Potresti farlo comescheduledExecutorService.awaitTermination(1,TimeUnit.MINUTES);
. In alternativa, che ne dici di verificare se una delle attività è stata annullata prima del suo normale completamentoif (task1schedule.isCancelled() || task2schedule.isCancelled()) scheduledExecutorService.shutdown();
:?