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