Javaのバーチャルスレッドを利用してみた(3)感想とゲーム利用の有効性について考察

はじめに

前回の「Javaをexe化してみる(2)- jpackageの活用 と 自動化バッチの紹介 -」に続いて、
ちょっとだけディープな「中身」のお話を。

最新のJava(21以降)を使うと、プログラムがどんなふうに動いてくれるのか。
進化し続けている、Javaを紹介しちゃいますね。

気づかせてくれるのは、Gemini3ちゃんなんだけどね。

1. JavaのスレッドはOSのスレッドで動く!

これまでスレッドって「なんとなくの処理の集まり」くらいに思っていたけれど、
実は今のJavaは、PCの中にある**「CPUコア(計算機)」に直結**して動いていることを知りました。

漠然と「スレッド」というものを理解していましたが、ちゃんと紐づいている。
知りませんでした。

「1つの処理(スレッド)は、常に1つのコアが担当する」 これが基本的なルールなんだそうです。

2.もっと有効的に使おう!バーチャルスレッド!

上記のように1:1で対応するというのが基本の考えで、
Javaであろうと、1スレッド1CPUの考えは変わらないそうです。

たとえば、今回のように数千の天体があって、個別にスレッドを割り当てている場合ならば、
数千スレッドがCPUに割り当てられるとか。

その考え方を変えて、キャリアスレッドというものが、一度引き受けて、論理的なスレッドにしているらしいです。
CPUに対して数千スレッドを作るわけではなく、その数千スレッドはJavaで振り分けをして、
CPUに対する負荷を下げよう。という試みみたいです。

3. 暇なコアを作らない!賢い仕事分散をするよ!

今のCPUはコアがたくさんありますが、中には「重い処理」でハマっちゃうコアも出てきます。
そこでJavaの最新機能が本領発揮!

基本は順番待ち

基本的には自分の担当するコアでお行儀よく並びます。

暇なコアが助けに来る

「あっちのコア、ハマってるな。暇だから手伝ってやるよ!」

暇になったコアが、忙しいコアの行列の**「後ろ」から**ガバっと!勝手に仕事を奪い取って、代わりに処理を始めちゃうんです。
これ、「ワークスティーリング(仕事泥棒)」って名前がついているらしいです。
名前はちょっと・・・ですが、おかげで全コアが働いてくれて、効率的に仕事をしてくれるようになるそうです。

アップデートが必要なきん

なかなかJavaのアップデートについていけないわたし、きん。

よりよくなっている屋台骨?土台?そこにもスポットライトを当てて、今後も紹介していけたらと思っています。

もしかしたら・・・

シューティングゲーム編で、1スレッドでかなり重い処理を割り当てているので、見直してみようかな・・・

と思っている次第です。

やる気になったら、やってみますね~。

(蛇足)「効率」をとるか「順番」をとるか

「後ろから奪ったら、順番が入れ替わっちゃうんじゃない?」 鋭い人ならそう思うはず。はい、その通りなんです!
でも、今のJavaはこう割り切っています。
「銀行の振込みたいに順番が命の処理は、今まで通り丁寧にやろう。」
「でも、シミュレーターの計算みたいに大量の処理は、少しくらい順番が前後しても、全コアを使って速く終わらせるほうがいいよね!」
だそうです。(Gemini3ちゃん談)

さいごに

どちらかというと、フロントエンド側で語られることは少ないJava。
でも、使い方次第で、使えるんだよ。って再認識させられる。

わたし自身が一番の推しがJavaってことがあるけれど、
(30年くらいやってるからね・・・)
(最近はフロントエンド側はJavaScriptベースだけどねー。わたしは)
まーまったりと紹介できたら~♪と思っています。

今回の記事まとめ

Javaで太陽系天体シミュレーター&JavaをExe化してみました。(Java21以降対応)
Javaをexe化してみる(2)- jpackageの活用 と 自動化バッチの紹介 -
Javaのバーチャルスレッドを利用してみた(3)感想とゲーム利用の有効性について考察

Youtubeに載せました♪
https://youtu.be/NPsgNbhEtds

シェアしていただけるとうれしいです。

Javaをexe化してみる(2)- jpackageの活用 と 自動化バッチの紹介 -

前回の「(1)」では概要をお伝えしましたが、
今回は実際に配布可能なExeファイルを作るための「自動化バッチ」の中身を詳しく解説します。

1. なぜ「jpackage」なのか?

Java 14から導入された jpackage は、**「実行環境(JRE)を同梱できる」**点にあります。

以前のようにユーザーに「Javaをインストールしてください」とお願いする必要がなく、
配布したフォルダ内のexeを叩くだけで動く、現代的な配布形態が可能です。

ただ、ファイルサイズがけっこう大きくなります。

2. ビルドを行うバッチファイル(makeExe.bat)

私が今回のシミュレーターで使用したバッチファイルを紹介します。


@echo off
setlocal
echo === Java EXE Build System (JDK 25) ===

REM (1)事前準備
REM 環境変数で一括管理
REM 自分自身の環境に合わせて修正してください
echo [1-1] 環境変数設定...
set JAVA_HOME=C:\Java\jdk-25.0.1
set APP_NAME=SolarSystemSim
set MAIN_CLASS=SolarSystemSim
set VERSION=1.0.0

REM 必要なフォルダを作成
echo [1-2] フォルダ作成...
if not exist "out" mkdir "out"
if not exist "dist" mkdir "dist"
if not exist "release" mkdir "release"

REM (2)コンパイル
echo [2] コンパイル中...
"%JAVA_HOME%\bin\javac" ^
  -d out *.java

REM (3)「dist」フォルダへjarファイルを集約
echo [3] distフォルダ構築 jarファイル作成中。
echo Main-Class: %MAIN_CLASS% > manifest.txt
"%JAVA_HOME%\bin\jar" cvfm dist\%APP_NAME%.jar manifest.txt -C out .

REM (4)パッケージング。EXE化
echo [4] パッケージ作成中 (app-image)...
"%JAVA_HOME%\bin\jpackage" ^
  --name "%APP_NAME%" ^
  --type app-image ^
  --win-console ^
  --input dist ^
  --dest "release" ^
  --main-jar "%APP_NAME%.jar" ^
  --main-class "%MAIN_CLASS%" ^
  --vendor "KIN"

echo === 全工程完了! release\%APP_NAME% 内の %APP_NAME%.exe を実行してください ===
pause

3. ポイント解説

jar化は必須

jpackageはJARファイルを入力として受け取るため、この工程は必須です。
この際、マニフェストファイルを使用して、アプリの起動地点(Main-Class)を明示するのがポイントです。

–type app-image

インストーラーではなく、実行に必要なファイル群を一つのフォルダにまとめます。ポータブルに持ち運びたい場合に最適です。
インストーラにしたい場合は、
–type exe
–type msi
にしてください。
わたしはインストールするまではちょっと・・・って感じでフォルダにまとめるところまでにしています。

–win-console の役割

これを入れると、アプリ(exe)を起動した瞬間に、背後で「コマンドプロンプト(黒い画面)」が一緒に立ち上がるようになります。

入れるメリット(デバッグ用):

プログラムの中で System.out.println(“天体の計算開始…”); のように書いているメッセージが、その黒い画面にリアルタイムで表示されます。
もしエラーで落ちた時も、そこにエラーメッセージ(スタックトレース)が残るので、「なぜ動かないのか」を突き止めるのに必須です。

入れないメリット(製品用):

純粋にシミュレーターの画面だけがポーンと立ち上がります。
一般ユーザーからすると「余計な黒い画面が出ない」ので、見た目がスッキリして「完成品」っぽく見えます。
デバッグが済んだら、取っちゃう方がスマートでしょうね~。

今回の記事まとめ

Javaで太陽系天体シミュレーター&JavaをExe化してみました。(Java21以降対応)
Javaをexe化してみる(2)- jpackageの活用 と 自動化バッチの紹介 -
Javaのバーチャルスレッドを利用してみた(3)感想とゲーム利用の有効性について考察

Youtubeに載せました♪
https://youtu.be/NPsgNbhEtds

シェアしていただけるとうれしいです。

Javaで太陽系天体シミュレーター&JavaをExe化してみました。(Java21以降対応)

Javaで太陽系天体シミュレーターを作成して、その後、Exe化してみました。
(下の方にダウンロードリンクがあります)

シミュレーターのほとんどは、Gemini3くんに手伝ってもらいましたが(笑)、
何時間もかけて調整を行って、なんとなく自分的にいい感じになりました。

実際の縮尺や時間からはかなり調整をかけています。
見ていて楽しめるように調整をしています。

画面イメージ

SolarSystemSim

見せどころ

初期のシミュレーターからいろいろとお願いをしてみました。
1)天体名が分かるようにスペースキーで表示するようにしました。
2)上下左右キーで拡大/縮小/時間調整ができます。
3)惑星および有名な準惑星をプロットしてみました。
4)主な彗星をプロットしてみました。名もない彗星もランダムに置いています。
5)エッジワースカイパーベルト、散乱円盤、オールトの雲もイメージ化しています。
6)シューメーカー・レヴィ第9彗星を蘇らせています。
詳しくは知らなかったですが、木星の重力圏にとらえられて、最後は分解・飲み込まれたみたいですね。
その重力圏にとらわれたイメージにしています。ぶつかりはしません。
7)見えるものではないですが、Java21から対応されているVirtual Threadを利用して、リソースを省力化しています。
なので、Java21以降対応になります。

Virtual Threadの採用について

わたしも今回初めて知ったVirtual Threadを採用しています。
数千の天体一つひとつが独立して計算を行い
(バーチャルスレッド。すべての天体が別のスレッドで動いています)
かつ メインの描画スレッドを邪魔しないスムーズな挙動を実現しています。
Javaで実現した『並列処理の宇宙』をぜひ体験してください。

JavaのExe化

前回のExe化はJavaFXとパッド対応まで含めて対応しましたが、
今回はピュアJavaで試してみました。

Exe化したバッチファイルは、
添付のzipファイル内の
makeExe.bat
を見てくださいね。

今回の記事まとめ

Javaで太陽系天体シミュレーター&JavaをExe化してみました。(Java21以降対応)
Javaをexe化してみる(2)- jpackageの活用 と 自動化バッチの紹介 -
Javaのバーチャルスレッドを利用してみた(3)感想とゲーム利用の有効性について考察

Youtubeに載せました♪
https://youtu.be/NPsgNbhEtds

シェアしていただけるとうれしいです。