4.20. 構造化並列性 (プレビュー)
Red Hat build of OpenJDK 21 では、構造化並列性が導入されています。これは、異なるスレッドで実行されている関連タスクのグループを 1 つの作業単位として扱うために API を提供するプレビュー機能です。この API は並行プログラミングを簡素化し、エラー処理と取り消しを効率化し、読みやすさを向上させ、監視性を強化します。
構造化並列性パラダイムでは、タスク (つまり、スレッド) をサブタスクに分割でき、サブタスクをさらにサブタスクにネストすることもできます。このタイプのタスク階層により、取り消しの伝播 (つまり、タスクを取り消すと、そのサブタスクも自動的に取り消される) と、タスク間の相互作用をより適切に制御できるようになります。
以下に例を示します。
Response handle() throws ExecutionException, InterruptedException { try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Supplier<String> user = scope.fork(() -> findUser()); Supplier<Integer> order = scope.fork(() -> fetchOrder()); scope.join() // Join both subtasks .throwIfFailed(); // ... and propagate errors // Here, both subtasks have succeeded, so compose their results return new Response(user.get(), order.get()); } }
Response handle() throws ExecutionException, InterruptedException {
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Supplier<String> user = scope.fork(() -> findUser());
Supplier<Integer> order = scope.fork(() -> fetchOrder());
scope.join() // Join both subtasks
.throwIfFailed(); // ... and propagate errors
// Here, both subtasks have succeeded, so compose their results
return new Response(user.get(), order.get());
}
}
上記の例では、最初にスコープを作成し、次にこのスコープをフォークしてサブタスクを作成します。いつでも、元のスレッドまたはいずれかのサブタスクからスコープのシャットダウンを要求して、未完了のタスクをすべてキャンセルし、新しいサブタスクが作成されないようにすることができます。scope.join()
メソッドは、スコープがすべてのサブタスクの実行が完了するまで待機させます。.get()
メソッドは各サブタスクの結果を返します。
各サブタスクは、独自の StructuredTaskScope
を作成して、ワークロードをさらにサブタスクに分割することもできます。この場合、追加のサブタスクは、全体の階層内で親サブタスクの下にネストされます。
詳細は、JEP 453: Structured Concurrency (Preview) を参照してください。