Вариант использования для Future.cancel (ложь)?

В том, какая ситуация была бы, каждый хочет передать false для mayInterruptIfRunning параметр к Future.cancel()?

Если я понимаю правильно, если Вы передаете false и задача отменяется, но поток не прерван, результат (или ExecutionException) никогда не будет доступно, потому что задача все еще отмечена, как отменено (т.е. isCancelled() возвраты true и get() броски CancellationException.)

Другие возможные ситуации:

  • Runnable или Callable реализация не проверяет на прерывания и будет работать к завершению даже при прерывании его (здесь, прерывание не имеет никакого значения),
  • Задача уже завершилась перед вызовом cancel() (снова прерывание не имеет никакого значения),
  • Задача должна выполнить некоторую очистку, прежде чем она выйдет (правильно написанная реализация будет использовать try ... finally для этого.)
  • Задача не может сразу завершиться и должна продолжить выполнять операции, которые были бы затронуты прерываниями, например, блокирующимся вводом-выводом (в этом случае, Вы не должны, вероятно, звонить cancel вообще)

Таким образом, когда/почему Вы отменили бы задачу, не прерывая его?

13
задан finnw 11 November 2011 в 05:02
поделиться

1 ответ

Если вы боитесь, что прерывание выполнения задачи может привести к ухудшению состояния, и вы просто хотите отметить ее как отмененную, чтобы пользователи Future знали об этом (например, они должны знать, что запрошенная статистика не была выполнена вовремя).

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

Некоторая информация может быть найдена здесь , здесь и, конечно же, в великой книге Параллельное программирование на Java (написана парнем, который первоначально написал java.util.concurrent ).

8
ответ дан 1 December 2019 в 22:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: