Что происходит под Future.cancel(true)

Предположим, у меня есть экземпляр Runnable:

class MyTask implements Runnable {

  public void run() {
     //some heavy calculation which takes time
      Thread.sleep(5000)
     //rest code
     ...
  }

}

Затем я использую ExecutorService для отправки вышеуказанной задачи:

ExecutorService service = Executors.newFixedThreadPool(3);
Future<?> task = service.submit(new MyTask());

Теперь я могу отменить задание к task.cancel(true);. Я понял, что task.cancel(true) прервет рабочий поток, в котором выполняется эта задача, например Thread.currentThread().interrupt(). Но это только устанавливает флаг, чтобы сообщить, что рабочий поток прерван.

Мой вопрос: если MyTask Runnable начал работать, как на самом деле future.cancel(true) останавливает мой код в run(), продолжая выполнение остального кода? Существует ли периодическая проверка флага прерывания рабочего потока внизу? Я имею в виду, что не понимаю, как код в run() можно отменить, установив флаг прерывания только в значение true.


person user842225    schedule 22.10.2014    source источник
comment
Future.cancel позвонит Thread.interrupt(). В общем случае этот вызов не обязательно помешает потоку заниматься своими делами. По той же причине Thread.stop() и другие небезопасные методы устарели (см. объяснение в Javadoc). Вы должны организовать своих Runnables так, чтобы они могли своевременно обнаруживать состояние прерывания.   -  person Victor Sorokin    schedule 23.10.2014


Ответы (2)


Future.cancel не гарантирует, что ваш рабочий код перестанет выполняться. Что он делает, так это устанавливает флаг прерывания и заставляет любые блокирующие вызовы JDK вызывать InterruptedException. Ваш рабочий код может выбрать повторное создание прерванного исключения и периодическую проверку прерываемого флага, и в этом случае сработает механизм отмены. В противном случае вы можете принять решение проглотить InterruptedException и проигнорировать флаг iterrupted, и в этом случае механизм отмены ничего не сделает, а только установит для флага canceled значение true.

См. http://www.ibm.com/developerworks/library/j-jtp05236/< /а>

person Maxaon3000    schedule 22.10.2014
comment
Я думаю, что это должно быть Future.cancel НЕ гарантирует...!? - person isnot2bad; 23.10.2014

Существует метод isInterrupted(), который сообщает работающему коду в потоке, что он прерван, возвращая значение true/false.

Обычно это проверяется такими методами, как ожидание, сон, которые вы можете вызывать в потоке. Однако, если вы не используете эти методы, вам придется вручную проверить этот метод [ isInterrupted() ], чтобы определить, не прервал ли кто-то ваш поток.

Если случайно вы получите истину, вы можете решить, какое действие выполнить (скажем, например: выдать InterruptedException или выйти из цикла и т. д.).

person MJSG    schedule 22.10.2014
comment
@ MJSG, чтобы быть более понятным для меня, вы имеете в виду такие методы, как sleep (), ожидание () и т. Д., Ниже, они вызывают isInterrupted (), чтобы проверить, прерван ли текущий поток? А если правда, то они просто ломаются, да? - person user842225; 23.10.2014
comment
Они бросают InterruptedException, если обнаруживают, что их прервали. - person Will Hartung; 23.10.2014
comment