安全でないスレッド終了から協調的キャンセルへ
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
難易度
上級
JDKサポート
安全でないスレッド終了から協調的キャンセルへ
利用可能
FutureとExecutorServiceはJDK 5(2004年9月)から利用可能です。
仕組み
Thread.stop() は、モニタを保持している最中や共有状態を更新している最中にコードを終了させる可能性があり、オブジェクトが破損したままになることがあります。現代的なキャンセルは協調的です。割り込みでFutureをキャンセルし、可能な限りInterruptedExceptionを伝播させ、伝播できない場合は割り込み状態を復元し、安全なキャンセルポイントに到達するようタスクを設計します。
関連ドキュメント
証明