👋

Java:「プラットフォームスレッド」 と 「仮想スレッド」

に公開

プロローグ

こんにちは、Java見習いの者です。以下の記事は、私が本やネットで勉強して自分なりに言葉にしたものです。
ぶっちゃけ自分の備忘録みたいなものです。
なので内容に関して誤りもあるかもしれませんが、あしからずご了承くださいませ。

目的

この記事ではJavaのマルチスレッドプログラミングについて記載しています。

本題

という話ですが、

まず、「マルチスレッドプログラミング」という言葉についての説明です。
これは並行処理技法の1つのことです。

なにもしなければ、基本シングルスレッドです、
ただこれだと メインの処理で大量の処理をしてしまった場合、固まってしまい何もさわれない状態となります。 要は プロセッサを専有してしまっています。

じゃあ

プロセッサを 占有しないようにするにはどうすればいいのか?

そこで並行処理技法の1つである「マルチスレッドプログラミング」があげられます。
「マルチスレッドプログラミング」は、並行処理を可能にするため、
あるスレッドの待機中は、別スレッドにプロセッサを割り当てられます。

このプロセッサ割り当てには2種類あり、

1. OSレベルで実施
2. JVMレベルで実施

この2つの違いが、「プラットフォームスレッド」と「仮想スレッド」の違い。
ちなみに 1が「プラットフォームスレッド」2が「仮想スレッド」。
※ 仮想スレッドは、Java21から正式リリースされたものであり、それ以前はプラットフォームスレッドしかありませんでした。

スレッドの生成方法

まず、プラットフォームスレッドの生成コードを記載しています。

//プラットフォームスレッド
Thread pThread = Thread.ofPlatform();
pThread.start();
pThread.join();

もしくは、普段通りの書き方にするならば、

//プラットフォームスレッド
Thread pThread = new Thread();
pThread.start();
pThread.join();

次に、仮想スレッドの生成コードを記載しています。

//仮想スレッド startメソッドの書き方を変えてみた
Thread vThread = Thread.ofVirtual().start(() -> {
    System.out.println("Virtual Thread...");
});
vThread.join();

仮想スレッドを生成する場合は、Threadクラスを使用し ofVirtualメソッドで ファクトリオブジェクトを取得する。プラットフォームスレッドを生成したい場合は、単純に、ofPlatformメソッドに変えてあげればいい。

エピローグ

どちらを使うべきかは、処理の対象や状況によって変わってくるみたい。
例えば、画像処理や機械学習は「プラットフォームスレッド」が優れてくるとのこと、またHTTPサーバやDBアクセス処理をする場合は、「仮想スレッド」のほうが優れているみたい。OSスレッドの数には制限がでてくるから?

最後に これは私が読んだ本の抜粋

Thread Platform (ms) Virtual (ms)
10,000 6,569 5,054
100,000 35,055 5,843
1000,000 323,377 13,028

仮想スレッドは、スレッド数が増えるほど処理速度が向上するとのこと。

Discussion