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