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?
java
multithreading
java-8
concurrency
runnable
totothegreat
fonte
fonte
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();
:?Respostas:
A ideia é que as tarefas sejam enviadas para um objeto comum TaskCompleteEvent. Se eles enviarem um erro, o planejador será parado e todas as tarefas serão interrompidas.
Você pode verificar os resultados de cada iteração de tarefas nos mapas "erros" e "sucesso".
fonte
Você só precisa adicionar uma tarefa adicional cujo trabalho é monitorar todas as outras tarefas em execução - e quando alguma das tarefas monitoradas falha, elas precisam definir um semáforo (sinalizador) que o assassino pode inspecionar.
fonte
TimerTask
tem nenhuma relação comScheduledExecutorService
; apenas acontece de implementarRunnable
. Além disso, não faz sentido agendar uma tarefa periódica, apenas para verificar se um horário específico (ConfigurationOptions.getPollingCycleTime()
) foi atingido. Você tem umScheduledExecutorService
, para que possa agendar a tarefa corretamente para o tempo desejado.TimerTask
porRunnable
e você corrigiu o problema, sem alterar o que o código faz. Além disso, basta usarexecutor.schedule(assassin, ConfigurationOptions.getPollingCycleTime(), ChronoUnit.MINUTES);
e ele será executado uma vez no horário desejado; portanto, aif(LocalDateTime.now().isAfter(death))
verificação é obsoleta. Novamente, isso não muda o que o código faz, além de fazê-lo substancialmente mais simples e mais eficiente.