Отмена задачи в 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 когда они обнаруживают прерывание.

Другие вопросы по тегам