パスワードを忘れた? アカウント作成
15775185 story
プログラミング

Java 19搭載予定の新機能「Virtual Thread(仮想スレッド)」 49

ストーリー by nagazou
NEW 部門より
あるAnonymous Coward 曰く、

Javaで仮想スレッドなるものが登場。
並行並列プログラミングがやりやすくなるのだろうか。

gihyo.jpに「Java 19の注目新機能Virtual Threadについて」と題する記事が掲載されている。TechFeed Conference 2022のMicrosoftの寺田佳央氏の講演をもとにした内容となっている(gihyo.jpJava 19 の注目新機能 Virtual Thread について)。

9月にリリース予定のJava 19では「Virtual Thread(仮想スレッド)」という機能が新たに追加され、大量の処理で負荷のかかるようなアプリケーションや並列処理などで効果を発揮するとしている。記事によるとJavaの仮想スレッドを利用することにより、Javaのバーチャルマシンの中でスレッドを作成したり管理できるようになり、ネイティブスレッドに比べて少ないメモリで高速にスレッドを作成することができるとしている。

  • by Anonymous Coward on 2022年09月01日 14時36分 (#4316833)

    Javaに求めるのは既存プロダクトの維持だけで、新規開発には用いない。

    ここに返信
  • by Anonymous Coward on 2022年09月01日 14時55分 (#4316860)

    なんかリンク先の人の説明がざつだなあ
    これまでJavaのスレッドっていわゆるグリーンスレッドとネイティブスレッドのどちらがいいかってずっと言われてて、ネイティブスレッドのスレッド生成コストを見極めつつM:Nスレッドにしようとかいろいろ議論と実装がなされてきたよね

    ここに返信
    • by Anonymous Coward

      FreeBSD版Javaの1.3~1.6あたりだとネイティブスレッドが未実装の場合に使う
      互換実装がグリーンスレッドって呼ばれてたような

      • by Anonymous Coward

        それと何が違うんですかという話だ

        • by Anonymous Coward

          ネイティブスレッドをサポート出来てるか
          サポート出来ずになんちゃってスレッドしかない実行環境なのかって話

          ネイティブスレッドと なんちゃってスレッドの比較で
          なんちゃってスレッドの方が効率的な場合もあるから
          なんちゃってスレッドもサポートしようみたいな話

          って感じで微妙にレイヤが違うような……

    • by Anonymous Coward

      講演なんだから時間制限ある中説明が雑になるのも仕方ないだろ

  • by Anonymous Coward on 2022年09月01日 15時03分 (#4316871)

    カーネルスレッドを利用せずOS資源的には1スレッド内で複数のコード/スタックを自前でスケジューリングするとかじゃないですよね?
    タスクスイッチやOS資源的には軽くなるけどマルチコアが活かせないし工夫しないとブロッキングI/Oで全部止まっちゃう古式ゆかしい実装ですが

    ここに返信
    • by Anonymous Coward

      > カーネルスレッドを利用せずOS資源的には1スレッド内で複数のコード/スタックを自前でスケジューリングするとかじゃないですよね?
      それじゃないの?
      unix系ならsetcontextとか、windowsならfiberとか昔からあるやつ。
      言語使用で対応しましたということでは?

    • by Anonymous Coward

      カーネルスレッドとかネイティブスレッドってキーワードを知ってる老人から見ると、何を今更って話ですね。 んなもん setjump() と longjump() 使えばC言語でも実装できるわ!rubyなんて当初からそうやって実装されてるわ!余計な機能入れるな!などなど言いたいことは沢山あるでしょう。

      違うんですよ。

      最近はコルーチンとかが流行ってい

      • by Anonymous Coward

        コルーチンってそれこそC言語しかなかった時代にはもうあった言葉では…

        • by Anonymous Coward on 2022年09月01日 16時38分 (#4316956)

          コルーチンは、プアマンズスレッドみたいな扱いされてたことがあるけど、ここ5年か10年くらいで、コルーチンであることが見直されて流行り出してるんですよ。
          ラムダとかと一緒。
          概念や実装そのものは、80年代とか70年代とかに出てるけど、最近になって見直されてる。

          # なんかソフトウェア業界の流行り廃りは間隔が早いって言われるが、言語仕様の流行りだと5年、10年単位だな。

          • by Anonymous Coward

            更に時代はめぐってselect,pollが流行の最先端に

            • by Anonymous Coward

              スマホも出てきてしばらくしてから「マルチタスクに対応した!」とか言ってたしな

              • by Anonymous Coward

                Windowsのストアアプリも出てきてしばらくしてから「マルチウィンドウに対応した!」とか言ってたしな。

          • by Anonymous Coward

            当初は割に合わなかったものも現代では誤差にしかならんからおk
            みたいなのもあるんじゃないかな

        • by Anonymous Coward

          Cより古い。(1963)

      • by Anonymous Coward

        コルーチンはyieldの前後で実行するスレッドが変わることがあるので、
        STAなCOMと一緒に使うとドはまりするので要注意ですね。

        • by Anonymous Coward

          そんな(マイナーではないけど)一部の実装に限ったことを…

        • by Anonymous Coward

          Thread Local Storageもな

        • by Anonymous Coward

          Fiber実装になってないの?

          • by Anonymous Coward

            fiber的にすることで、あえてスレッドを乗り換えることができる実装がある。
            UIスレッドは止めちゃダメなフレームワークなとき、ソース上の区切りのいいところからワーカスレッドにきれいに移れる。
            そういう目的・仕組みを理解して使ってねってこと。

        • by Anonymous Coward

          GILが邪魔なのでスレッドはあんま使いません

        • by Anonymous Coward

          WindowsのFiber以外で実行するスレッドが変わる実装なんてあるか?

      • by Anonymous Coward

        昔、コルーチンをsetjump/longjumpで無理矢理実装して、嵌った老人が来ましたよっと。
        setjumpは実装によって、全部のレジスタが保存されるとは限らないのよね。
        あと、スタックをOSの想定していない場所に配置すると動作がおかしくなったり。。。

      • by Anonymous Coward

        Linuxカーネルのworkerと何が違うのって思う。
        あれも自前でworkqueue用意するとかしない限り、各CPU毎のkworkerで良い感じに処理してくれるしなぁ。

    • by Anonymous Coward

      記事読むとご指摘の通りのなんちゃってスレッドですね
      多分工夫しなくてもI/Oでブロックされないプログラムが作れるものだと思います

      デメリットはマルチコア使えないのでCPU負荷が高い場合は向いてないとリンク先の記事に書かれてますね

      メリットは使用メモリが少なく済むとかいろいろあるけど
      最近のマルチCPUには向いてるかも?
      CPUの近くにメモリが配置されるようになったけど、逆に別CPUに繋がってるメモリは遠くなってるので
      下手なマルチスレッドで共有メモリ使うものは性能が上がりにくくなった可能性がある
      逆に昔ながらのプロセスモデルだと、近くのメモリを使うので性能が上がりやすい
      マルチスレッドをグループで管理してなるべく近くのメモリを共有する仕組みがうまく当てはまれば問題ではないんだろうけど

    • by Anonymous Coward

      WindowsのUser-Mode Schedulingならブロッキングするsyscallした時点で自動で切り替わるよ

      と思ったらUMS死んでた

  • by Anonymous Coward on 2022年09月01日 20時05分 (#4317115)

    まだあったんだ

    ここに返信
    • by Anonymous Coward

      あと未だに10番代っていう進化の遅さ。

      • by Anonymous Coward

        LTSが重視される業界もあるのですよ
        そしてあなたが使っているインフラもきっとJavaで動いてる
        なにせ30億のデバイスで走るJavaですからね!

      • by Anonymous Coward

        むしろそんな頻繁にバージョンが上がる言語とか糞ったれだと思うが。

        そもそもバージョン10を超えてる言語ってそんなに無いだろ。

    • by Anonymous Coward

      アンドロイドアプリ開発で主に使われている言語ですよ!

      • by Anonymous Coward

        だからモッサリ動作で不安定なんだね^^

      • by Anonymous Coward

        冗談でもそういうデマを書くのはやめろ

    • by Anonymous Coward

      アンドロイドで使われてるから、世界で一番使われてる言語なんじゃないか?
      当分、安泰な気がする。
      まだjava8相当だっけ?

      • by Anonymous Coward

        今から新規でjavaとかありえないよ。
        世間から10年単位で時間が遅れているような環境だとありえるけど。

        • by Anonymous Coward

          現実は世間から10年単位で時間が遅れてる世界の規模 >> 世間の規模ですね

  • by Anonymous Coward on 2022年09月02日 0時05分 (#4317219)

    グリーンスレッドやめてネイティブスレッドに変えた頃はまさか今頃になってグリーンスレッドが必要になるとは思わなかっただろうな

    ここに返信
  • by Anonymous Coward on 2022年09月02日 13時30分 (#4317594)

    大昔(バージョン1.5)にスレッドプールが導入され、
    「ネイティブスレッドの都度生成は止めて使いまわしましょう。Threadではなくタスク(Runnable)を使いましょう。」
    で並行処理は組まれているでしょう。なぜ今更仮想スレッドが必要になるのでしょうか?

    JEP425によると、従来の方法では待機処理に対して効率が悪いと指摘しています。
    Javaでは待機処理はネイティブスレッドそのものを止めてしまい、待っている間に他のタスクを実行することはありません。
    そのため、待機処理が1秒あるタスクを従来のスレッド200個で処理する場合は待機処理の制約により最大200件/秒の処理速度しかでません。
    スレッドの数を増やせば処理速度は改善しますが、ネイティブスレッドではOSの制約により多く作ることはできません。

    一方、仮想スレッドの場合はOSの制約無く大量に作ることができ、10000件のタスクがあれば10000個の仮想スレッドを作成するといった方法でスループットを改善できます。

    典型的なアプリケーションサーバーでは待機(たとえば、外部サーバーからのレスポンス待ちとか?)を含む大量の処理を行うため、仮想スレッドによりスループットの改善が見込めます。

    # 仮想スレッドの速度自体はネイティブスレッドより速いわけではないので、
    # 待機の無い計算負荷の高い処理にたいして、仮想スレッドは助けにならない。
    # とJEPには書いてあるけど、どうして記事ではその点を書いてないのだろう?

    ここに返信
    • by Anonymous Coward

      仮想スレッドとネイティブスレッドの速度差について
      昔は確かにネイティブの方が速いと言われてたが
      今はネイティブのオーバーヘッドが無視できなくなって必ずそうとは限らなくなったということ

      特に最近のCPUの進化が変な方向に行っていて
      ネイティブスレッドのオーバーヘッドが余計に大きくなった感じある

    • by Anonymous Coward

      本質的に ExecutorService と変わらんだろ、と言いたいのはわかるけど。
      現行の仕様だと実行中にIO入ったら切り変えていい、とはならないのでは。
      多分裏ではIOの所で io_uring とかを使う想定で、async/await 構文を導入する布石なんじゃないかな。

typodupeerror

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

読み込み中...