Отмена задачи в threadPoolExecutor
Я создал экземпляр threadPoolExecutor и отправил асинхронную задачу в пул и получил объект Future, а затем попытался отменить задачу, операция отмены не работает...
Задача связана с вызовами базы данных.
Код как ниже,
private ThreadPoolExecutor _scheduledThreadPool;
_scheduledThreadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(_poolSize, factory);
Future<Object> task = _scheduledThreadPool.submit(task);
tasks.cancel(true);
После приведенного выше кода я заметил, что _scheduledThreadPool.getQueue() дает пустое значение.
Я работаю над этим с нескольких дней, но не работал.
Пожалуйста, помогите мне, как отменить задачу индивидуально в ThreadPoolExecutor.
Спасибо
2 ответа
Если задача уже выполняется во время вызова метода cancel(), что, по-видимому, и происходит в вашем случае, то это не "волшебным образом" гарантирует, что задача остановится так, как вы ожидаете., Поток, выполняющий задачу, будет прерван, и код, выполняемый вашей задачей, должен обработать это с вашим желаемым поведением.
Ты можешь попробовать:
_scheduledThreadPool.getQueue().clear();
У нас есть Future
объект здесь:
Future<Object> task = _scheduledThreadPool.submit(task);
ThreadPoolExecutor
использует FutureTask
по умолчанию Future
реализация. А такжеFutureTask
использует прерывание потока для отмены задачи. Итак, он вызываетThread.intterrupt
в рабочем потоке.
Однако, чтобы отмена произошла, задача должна реагировать на прерывания. Другими словами, он должен проверить, не прерывается ли текущий поток, вызываяThread.interrupted
/Thread.currentThread().isInterrupted
. В качестве примера мы проверяем статус прерывания в цикле:
final Runnable task = () -> {
while (!Thread.currentThread().isInterrupted()) {
// Do work.
}
}
В качестве альтернативы задача должна быть заблокирована в коде, который учитывает прерывание, например LinkedBlockingQueue.take
. Стандартные библиотеки обычно бросаютInterruptedException
когда они обнаруживают прерывание.