От небезопасного завершения потоков к совместной отмене
Замените Thread.stop() и импровизированные общие флаги отменой задач с учётом прерываний.
Thread worker = new Thread(this::runTask); worker.start(); // May stop the thread while shared state is inconsistent. worker.stop();
Future<?> worker = executor.submit(this::runTask); // Requests interruption; the task must cooperate. worker.cancel(true);
Сохраняет инварианты
Задачи останавливаются только в местах кода, предназначенных для отмены.
Стандартное управление
Future представляет выполнение, завершение и отмену вместе.
Компонуемость
Прерывание работает с блокирующими очередями, локами, executor'ами и виртуальными потоками.
Future и ExecutorService доступны начиная с JDK 5 (сент. 2004).
Thread.stop() может завершить код в тот момент, когда он владеет мониторами или обновляет общее состояние, оставляя объекты повреждёнными. Современная отмена является совместной: отменяйте Future с прерыванием, распространяйте InterruptedException, где это возможно, восстанавливайте статус прерывания, когда его нельзя распространить, и проектируйте задачу так, чтобы она достигала безопасных точек отмены.