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年9月)から利用可能です。

Thread.stop() は、モニタを保持している最中や共有状態を更新している最中にコードを終了させる可能性があり、オブジェクトが破損したままになることがあります。現代的なキャンセルは協調的です。割り込みでFutureをキャンセルし、可能な限りInterruptedExceptionを伝播させ、伝播できない場合は割り込み状態を復元し、安全なキャンセルポイントに到達するようタスクを設計します。