Javaスレッドは安いです!何百万もの人々をつくりましょう


Aditya Wardhanaによる写真
Javaスレッドは安いです.はい、あなたは右、私を聞いた.プロジェクトの織機を使用すると、文字通りJavaのスレッド数百万を作成できます.それについて話しましょう.

Disclaimer: in this article, I will not explain how thread and virtual thread works and the underlying concept; rather, I will demo that we can create millions of virtual threads using project loom.


スレッドはJavaのどこにでもあります.たとえば、ほとんどのJava Webアプリケーションでは、スレッドを1つの要求/応答のペアを処理します.それぞれの要求/応答は独立しています.要求で、サーバは要求を解析して、必要に応じてデータベースを照会して、応答を送ります.それは簡単で簡単.彼らの何人が奉仕されているかは、重要でありません;プログラミングモデルは同じでシンプルです.
現在、Webサーバは何百万もの同時オープンソケットを扱うことができます.つまり、より多くのスレッドを作成することができれば、アプリケーションは同時にリクエストを処理できるようになります.この結論は直感的に聞こえるかもしれませんが、実際には、限られた数のスレッドしか作成できません.オペレーティングシステムは数千個以上のアクティブ(非アイドル)スレッドを効率的に処理できません.
実験を行い、Javaアプリケーションで作成できるスレッドをたくさん考えましょう.
package com.bazlur;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;

public class ThreadCreationDemo {
 public static void main(String[] args) {
  var counter = new AtomicInteger();
  while (true) {
   new Thread(() -> {
    var count = counter.incrementAndGet();
    System.out.println("count = " + count);
    LockSupport.park();
   }).start();
  }
 }
}
whileループを使用して、新しいスレッドを作成し、それを駐車し続ける.AtomicIntegerを使用して、どのように多くのスレッドを作成し、アプリケーションをクラッシュさせるかをカウントします.
私のコンピュータ*を使用して、私は4058スレッドを作成することができたし、アプリケーションがクラッシュしました.
ご覧の通り、我々はどのように多くのスレッドを作成することができますし、アプリケーションで使用できるように制限されます.
最近では,この制限を解決するプロジェクトloomと呼ばれる新しいプロジェクトが開発されている.それを使用して、我々は文字通り仮想スレッドの数百万を作成することができます.
私は、今ここでプロジェクト織機を使用して、類似した経験をします
package com.bazlur;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;

public class VirtualThreadCreationDemo {
 public static void main(String[] args) {
  var counter = new AtomicInteger();

  while (true) {
   Thread.builder().virtual().task(() -> {
    var threadCount = counter.incrementAndGet();
    System.out.println("count = " + threadCount);
    LockSupport.park();
   });
  }
 }
}
上記のコードを使用して、私は400万以上の仮想スレッドを作成することができました.
スレッドと仮想スレッドの重要な違いは以下の通りです.
  • 仮想スレッドは、コード、ランタイム、およびdubberとプロファイルの正規スレッドについてです.つまり、開発者は新しいものを学ぶ必要はありません.
  • 仮想スレッドはOSスレッドのラッパーではなくJavaエンティティです.
  • 仮想スレッドはスーパー安いです.
  • あなたがプロジェクト・ロームについてもっと知りたいなら、ここにリソースがあります.
    https://cr.openjdk.java.net/~rpressler/loom/loom/sol1_part1.html
    https://wiki.openjdk.java.net/display/loom/Main
    コンピュータ構成:MacBook Pro(15インチ、2019)、2.3 GHz 8コアインテルコアI 9、16 GBのメモリ.
    このポストはもともと投稿されました