Concurrency 上級

並行タスクのライフタイムを単一の作業単位として管理する。

✕ 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 25でプレビュー(第5プレビュー、JEP 505)。--enable-previewが必要です。

構造化並行処理は、並行タスクのグループを1つの操作として扱います。いずれかのサブタスクが失敗した場合、他のサブタスクはキャンセルされます。スコープによりスレッドリークがなくなり、明確な親子関係が保たれます。

共有 𝕏 🦋 in