Concurrency Продвинутый

От небезопасного завершения потоков к совместной отмене

Замените Thread.stop() и импровизированные общие флаги отменой задач с учётом прерываний.

✕ Forced thread termination
Thread worker = new Thread(this::runTask);
worker.start();

// May stop the thread while shared state is inconsistent.
worker.stop();
✓ Future cancellation
Future<?> worker = executor.submit(this::runTask);

// Requests interruption; the task must cooperate.
worker.cancel(true);
Заметили проблему в этом коде? Сообщите нам.
🛡

Сохраняет инварианты

Задачи останавливаются только в местах кода, предназначенных для отмены.

🧩

Стандартное управление

Future представляет выполнение, завершение и отмену вместе.

🔗

Компонуемость

Прерывание работает с блокирующими очередями, локами, executor'ами и виртуальными потоками.

Старый подход
Thread.stop()
Современный подход
Future.cancel(true)
Начиная с JDK
5
Сложность
Продвинутый
От небезопасного завершения потоков к совместной отмене
Доступно

Future и ExecutorService доступны начиная с JDK 5 (сент. 2004).

Thread.stop() может завершить код в тот момент, когда он владеет мониторами или обновляет общее состояние, оставляя объекты повреждёнными. Современная отмена является совместной: отменяйте Future с прерыванием, распространяйте InterruptedException, где это возможно, восстанавливайте статус прерывания, когда его нельзя распространить, и проектируйте задачу так, чтобы она достигала безопасных точек отмены.