構造化並行処理
並行タスクのライフタイムを単一の作業単位として管理する。
コード比較
✕ Java 8
ExecutorService exec =
Executors.newFixedThreadPool(2);
Future<User> u = exec.submit(this::fetchUser);
Future<Order> o = exec.submit(this::fetchOrder);
try {
return combine(u.get(), o.get());
} finally { exec.shutdown(); }
✓ Java 25 (Preview)
try (var scope = new StructuredTaskScope
.ShutdownOnFailure()) {
var u = scope.fork(this::fetchUser);
var o = scope.fork(this::fetchOrder);
scope.join().throwIfFailed();
return combine(u.get(), o.get());
}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
スレッドリークなし
フォークされたタスクはすべてスコープが閉じる前に完了します。
高速フェイル
ShutdownOnFailureは1つが失敗すると兄弟タスクをキャンセルします。
明確な構造
タスクのライフタイムはコードのレキシカルスコープと一致します。
旧来のアプローチ
手動スレッドライフサイクル管理
モダンなアプローチ
StructuredTaskScope
JDKバージョン
25
難易度
上級
JDKサポート
構造化並行処理
プレビュー
JDK 25でプレビュー(第5プレビュー、JEP 505)。--enable-previewが必要です。
仕組み
構造化並行処理は、並行タスクのグループを1つの操作として扱います。いずれかのサブタスクが失敗した場合、他のサブタスクはキャンセルされます。スコープによりスレッドリークがなくなり、明確な親子関係が保たれます。
関連ドキュメント