Bom essa idéia funciona, mas acredito que o Quartz seja melhor, em questão de amadurecimento, eu uso pra monitorar alterações no banco, ele funciona como um agendador/disparador de Job(que seria as threads agendadas), mas vc pode usá-lo como pool de thread uma vez que vc pode definir o delay, se a thread deverá ficar rodando, vc pode dar um shutdown ou deixar em standby e etc. Ele é muito usado e esta bastante estável.
Aqui segue um exemplo:
`
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
JobKey jobKey1 = new JobKey("job1", "group1");
// aqui estou criando o job e definindo qual classe chamar queria a "AgendamentoJob"
JobDetail job1 = newJob(AgendamentoJob.class)
.withIdentity(jobKey1)
.build();
//Aqui estou definindo uma Trigger ao job para rodar e a cada 60 seconds ele irá disparar a thread
//sendo que a execução vai se repetir para sempre
Trigger trigger1 = newTrigger()
.withIdentity("myTrigger", "group1")
.withPriority(1)
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(60)
.repeatForever())
.build();
//preparando o agendamento
Scheduler scheduler = schedFact.getScheduler();
scheduler.start();
//aqui estou inicializando de fato o Job , e executando o agendamento
scheduler.scheduleJob(job1, trigger1);
`
Esse é job de fato
`
public class AgendamentoJob implements Job {
private final static String SYNC = "SYNC";
public AgendamentoJob() {
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
synchronized (SYNC) {
//seu codigo
}
}
}
`
Eu acredito que essa bilbioteca já faz tudo o que você precisa sem precisar criar o executorservice que controla o pool por que nessa lib tem a classe Scheduler que controla os jobs e os Triggers, ou seja, ele pausa ele encerra e etc
Acredito que seja isso que vc precisa, se caso não me explica a função desse ExecutorService