java ScheduledExecutorService как убивать зависший поток?

Есть вот такой кусок кода

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleWithFixedDelay(new Aggregator(configurer, jdbcManager), 20, 20, TimeUnit.MINUTES);

Т.к., пул потоков рассчитан на 1 поток, то, в случае его зависания, следующий поток запущен не будет. Мне же нужно при любых обстоятельствах запустить следующий поток. Каким будет лучший выход для меня? Единственное, что я смог придумать, это переписать код на

    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    service.schedule(new Aggregator(configurer, jdbcManager), 20, TimeUnit.MINUTES);
    service.shutdown();
    service.awaitTermination(19, TimeUnit.SECONDS);

а затем поместить его в таймер с интервалом в 20 минут, т.е. в еще один поток. Таким образом, таймер будет каждый раз инициализировать новый ScheduledExecutorService , который в свою очередь будет ждать завершения выполнения потока 19 минут, если поток завершится раньше - прекрасно, если нет, то поток таймера в любом случае умрет, унеся с собой зависший поток из ScheduledExecutorService. Правильно же я понимаю, что если ScheduledExecutorService инициализирован в отдельном потоке, то со смертью этого потока умрут все потоки, порожденные ScheduledExecutorService? Будет ли всё описанное выше решением моей проблемы и какими могут быть более правильные решения?

P.s. Далеко не каждый раз поток из ScheduledExecutorService зависает. До первого зависания может пройти несколько дней. Предотвратить зависание потока на данный момент невозможно.


Ответы (0 шт):