GMOアドマーケティングのT.Nです。
今回はJava 19でIncubatorの機能として追加されたStructured Concurrencyを試した内容をまとめました。
ブログを書く上で、以下のページを参考にしました。
https://openjdk.org/jeps/428
https://openjdk.org/jeps/437
Incubatorの機能なので、今後仕様が変わる可能性はあります。
Structured Concurrencyについて
Structured Concurrencyは、マルチスレッドプログラミングをシンプルにするために追加された機能です。
異なるスレッドで実行される複数のタスクを一つのユニットとして扱うことで、
エラーハンドリングなどを容易にします。
従来の並行処理では以下の問題がありました。
- 並行処理の一部が例外をthrowした場合に、他の処理が実行され続けて、スレッドリークが発生する。場合よっては他のタスクを妨害することがある。
- 呼び出し元のメソッドが割り込まれた場合に、サブタスクに伝播しないので、呼び出し元のメソッドが失敗しても処理が実行され続ける。
- 並行処理の一部がエラーになった場合に、他の処理にエラーが通知されず実行され続けるので、不要な待ちが発生する。
Structured Concurrencyを使用したプログラム
Structured Concurrencyを使用したプログラムを作成してみました。validationを並行で行うプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public record User(String name, int age, String address) { public boolean validate() throws InterruptedException, ExecutionException { try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Future<Boolean> future1 = scope.fork(() -> validateName()); Future<Boolean> future2 = scope.fork(() -> validateAge()); Future<Boolean> future3 = scope.fork(() -> validateAddress()); scope.join(); scope.throwIfFailed(); return future1.get() && future2.get() && future3.get(); } } private boolean validateName() { return name != null && !name.isEmpty(); } private boolean validateAge() { return 0 < age; } private boolean validateAddress() { return address != null && !address.isEmpty(); } } |
1 2 3 4 5 6 |
public static void main(String[] args) throws InterruptedException, ExecutionException { User user = new User("name", 20, "東京都"); boolean result = user.validate(); // true System.out.println(result); } |
Structured Concurrencyでは、
StructuredTaskScopeを使って並行処理を管理します。
今回の例のようにShutdownOnFailureを使うと、
並行処理が失敗した時に全体の処理が終了します。
他にShutdownOnSuccessというものがあり、
そちらを使うと並行処理の一つが成功した時に全体の処理が終了するので、
一番最初に完了した結果だけが必要な場合に便利です。
その場合の結果はscope.result()のように取得できます。
thread dumpについて
JEP 425のVirtual Threads (Preview)でthread dumpをJSON形式で取得できるようになりました。
1 |
jcmd <pid> Thread.dump_to_file -format=json <file> |
StructuredTaskScopeのスレッドが階層化されて見やすくなります。
まとめ
今回はStructured Concurrencyのソースコードを作成して試してみました。Structured Concurrencyはリリースされたらよく使う機能になりそうなので、
今後のリリース状況にも注目していきたいです。
明日はM.Nさんによる「GMO SSPにスクラムを本気で導入してみた」です。
引き続き、GMOアドマーケティング Advent Calendar 2022 をお楽しみください!
■学生インターン募集中!
https://note.gmo-ap.jp/n/nc42c8a60afaf
■エンジニア採用ページはこちら!
https://note.gmo-ap.jp/n/n02cbeb6edb0d
■GMOアドパートナーズ 公式noteはこちら!
https://note.gmo-ap.jp/