У меня есть задача, которую я планирую периодически запускать через ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, rate, ...). Пользователь может отменить эту задачу вручную, что вызывает ScheduledFuture.cancel(true). По какой-то причине, возможно, в зависимости от того, когда они отменяют эту задачу, рабочий поток (который исполнитель использовал для запуска моей задачи) остается в прерванном состоянии после выхода из метода run() моей задачи.
Я хотел бы, чтобы рабочие потоки (взятые из пула и повторно используемые) очищали свой статус прерванного перед запуском новой задачи с использованием существующих ловушек (через ThreadPoolExecutor.beforeExecute() или ThreadPoolExecutor.afterExecute()). Но это не делается в реализации по умолчанию.
У меня есть два вопроса:
- Как получается, что рабочий поток остается в состоянии, когда установлен статус прерывания?
- Почему реализация по умолчанию не очищает статус прерывания перед запуском новой задачи?