Достоверность возвращаемого значения Future method cancel (false)

Предположим, я планирую задачу с помощью ScheduledThreadPoolExecutor и получаю Future обратно.

Позже я решаю, что хочу отменить это Future, и полагаюсь на возвращаемое значение cancel для запуска некоторой операции очистки. Я не хочу, чтобы задача прерывалась, если она уже выполняется (поэтому я передаю false в качестве аргумента).

Является ли возврат отмены надежным? То есть, возможно ли, что если команда cancel вернула значение true, задача действительно выполняется?

Глядя на код в OpenJDK 8, похоже, что могло быть состояние гонки, при котором «отмена» устанавливает состояние задачи как ОТМЕНЕН и возвращает истину, но бегун, возможно, уже прошел «проверку», чтобы начать выполнение.

Насколько я понимаю, вычисление будет выполнено, но результат не будет установлен (что хорошо). Однако в моем случае «вычисление» имеет побочные эффекты, поэтому я хочу знать, действительно ли я отменил его или нет.


person Fabio    schedule 26.08.2014    source источник


Ответы (1)


В javadoc cancel(boolean) состояний

Попытки отменить выполнение этой задачи. Эта попытка не удастся, если задача уже выполнена, отменена или не может быть отменена по какой-либо другой причине.

В случае успеха и эта задача не была запущена при вызове отмены, эта задача никогда не должна выполняться. Если задача уже запущена, то параметр mayInterruptIfRunning определяет, следует ли прервать поток, выполняющий эту задачу, при попытке остановить задачу.

Акцент мой. Вызов вернет true при всех условиях, которые не являются ошибками. Поэтому возможно, что метод вернет true и ваша задача выполняется.

person Sotirios Delimanolis    schedule 26.08.2014
comment
Действительно. Я должен был лучше прочитать документ, прежде чем погрузиться в код. Вы можете посоветовать класс с нужной мне семантикой? В противном случае я сам сверну. Спасибо. - person Fabio; 26.08.2014
comment
@FabioT. Я не знаю другого API для этого, но вы можете переосмыслить побочные эффекты, если это возможно. - person Sotirios Delimanolis; 26.08.2014