構造化並行性モデル
関連するタスクを一つの単位として扱います。
「構造化並行性モデル」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
構造化並行性とは
構造化並行性(JEP 453、プレビュー)は、関連する並行タスクのグループを1つの作業単位として扱います。
親タスクがサブタスクに分割された場合、通常のコードにおけるブロックのスコープと同じように、親タスクが先に進む前にすべてのサブタスクが完了しなければなりません。
解決する問題
通常のエグゼキュータを使うと、生成したタスクが作成元より長く存続したり、リソースをリークしたり、忘れ去られたりする可能性があります。ある分岐で発生したエラーに気付かないまま、ほかの処理が実行され続けることもあります。
その結果、スレッドリーク、孤立した処理、分かりにくい障害処理につながります。
タスクをツリーとして扱う
構造化並行性は、親子関係を強制します。サブタスクは、それらを開始したタスクをルートとするツリーを形成します。
- サブタスクは親のスコープより長く存続できない
- 親はすべての子が完了するまで待機する
- キャンセルはツリーを下方向に伝播する
逐次コードを反映する
大切な考え方は、並行コードを逐次コードのように読めるようにすることです。スコープを開き、処理を分岐し、すべての処理が結合してからスコープを閉じます。
これにより、処理の存続期間が明確になり、エラーについても考えやすくなります。
従来の非構造化な方法
これは、通常のエグゼキュータを使った、よくあるものの非構造化な方法です。動作はしますが、2つの Future が調整された存続期間を共有する保証はありません。
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws Exception {
try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
Future<String> user = exec.submit(() -> "Ada");
Future<Integer> order = exec.submit(() -> 7);
System.out.println(user.get() + " has " + order.get() + " orders");
}
}
}調整が重要な理由
前の例では、ユーザーの取得に失敗しても、注文のタスクは無駄に実行され続けます。手動でキャンセルし、それぞれの get() から発生する例外を処理しなければなりません。
構造化並行性は、この調整を自動化します。
プレビューの状態
構造化並行性は、java.util.concurrent パッケージのプレビュー APIとして提供されています。使用するには、--enable-preview を付けてコンパイルおよび実行します。
中心となるクラスは StructuredTaskScope で、次のレッスンで扱います。
存続期間の保証
構造化されたスコープ内では、次のことが保証されます。
- スコープが終了する前に、すべてのサブタスクが完了、失敗、またはキャンセルされます
- バックグラウンドに残るサブタスクはありません
- スレッドダンプのコールスタックに、実際のタスク階層が反映されます
可観測性の利点
サブタスクのツリーが明示されているため、JDKのツールで表示できます。スレッドダンプでは、サブタスクが親スコープの下にまとめられるため、プールスレッドが分散している場合よりも、はるかに明確に問題を診断できます。
仮想スレッドとの相性
構造化されたスコープ内の各サブタスクは、デフォルトで専用の仮想スレッド上で実行されます。仮想スレッドは低コストであるため、多数のサブタスクに処理を分散することが現実的になります。
この2つの機能は、連携して動作するように設計されています。
メンタルモデル
構造化されたスコープは、並行処理のためのtry-with-resourcesブロックだと考えてください。スコープを開き、処理をforkし、joinしてから閉じます。閉じ中括弧があることで、実行中の処理が何も残っていないことが保証されます。
理解度チェック
基本原則を理解できているか確認しましょう。
まとめ
構造化された並行性のモデルについて学びました。
- 関連するタスクは、スコープの存続期間に結び付いたツリーを形成します
- 並行処理のコードを、逐次処理のコードのように読めます
- プレビューAPIであり、
--enable-previewが必要です - 仮想スレッドと自然に連携します
次は、StructuredTaskScope APIそのものについて学びます。
よくある質問
「構造化並行性モデル」レッスンは無料ですか?
はい。「構造化並行性モデル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「構造化並行性モデル」で何を学びますか?
関連するタスクを一つの単位として扱います。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「構造化並行性モデル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。