Предположим, у меня есть Runnable
экземпляр:Что происходит под Future.cancel (истинной)
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», чтобы они могли своевременно обнаружить прерывистый статус. –