Usar um único Timer e um ExecutorService ilimitado (pool de threads) para esse tipo de agendamento de propósito geral pode ser muito poderoso. No entanto, ele não interrompe a execução simultânea da tarefa, caso a invocação anterior ainda não tenha sido concluída.
Combinamos Timer e ExecutorService apenas para esse propósito, junto com a capacidade de restringir o número de tarefas simultâneas com base no número de CPUs disponíveis para o sistema (apropriado para tarefas ligadas à CPU):
Para interromper a invocação simultânea apenas com essas duas ferramentas, você precisará reverter sua própria proteção.
Eu resolvi esse problema recentemente criando um "ConcurrencyLimiter" que serializará o acesso a um pedaço arbitrário de código / recurso dado um objeto de chave arbitrária. Se um segundo thread tentar executar a mesma tarefa, ele simplesmente aguardará e usará o resultado do primeiro encadeamento. Assim, a concorrência é evitada e ambos os encadeamentos obtêm uma resposta significativa.
No que diz respeito à limitação de simultaneidade no próprio agendador de tarefas, há também uma implementação Java simples e simples do cron que permite evitar a execução simultânea e manipula todo o agendamento:
Fonte em link (depende de link ) e link Todos LGPLv3 e livre para o mundo, sem dependências externas e Java 1.6 +.
O ponto aqui não é ligar meu próprio código. Eu só quero ressaltar que você pode lidar com isso no nível de agendamento ou dentro da tarefa em si.
Desculpe - perguntas vagas recebem respostas vagas.