Почему Future.cancel(true) не останавливает задачу мгновенно

Вопрос звучит просто: что делает cancel(true) у Future. Большинство отвечает «прерывает поток» и на этом останавливается. Интервьюер ждёт продолжения — что именно происходит дальше с задачей.

cancel(true) выставляет флаг отмены и вызывает Thread.interrupt() на потоке, который выполняет задачу. Это не силовая остановка — JVM не умеет убивать поток посреди выполнения произвольного кода. Прерывание — это просьба, а не команда.

Если код внутри задачи не проверяет Thread.interrupted() и не вызывает блокирующие методы, которые реагируют на прерывание (sleep, wait, join, блокирующие операции каналов), задача спокойно доработает до конца, игнорируя отмену полностью.

Future future = executor.submit(() -> { while (!Thread.currentThread().isInterrupted()) { doWork(); } }); future.cancel(true);

Спросят, что будет, если задача ловит InterruptedException и глотает её без восстановления флага — catch (InterruptedException e) {} без Thread.currentThread().interrupt(). Ответ: отмена теряется окончательно, задача продолжит работу как ни в чём не бывало, и следующий код выше по стеку даже не узнает, что прерывание было.

Отмена через Future — это кооперативный протокол. Она работает только если код задачи сам согласен останавливаться.

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки