性能文章>【译】在Java中创建了100万个线程以后>

【译】在Java中创建了100万个线程以后转载

3周前
341636
Thread Pool Size = Number of CPU Cores + 1
  1. 调度器—这是一个ForkJoin池,其大小通常等于CPU中的核心数量。
  2. 载体线程—载体线程,指的是负责执行虚拟线程中任务的平台线程,或者说运行虚拟线程的平台线程称为它的载体线程。
  3. Continuation切换——这类似于运行,生成调用,其中虚拟线程可以根据JVM所做的在运行和空闲之间切换。
    例如:-当虚拟线程执行数据库查询或HTTP请求等阻止调用时,它可能会生成,直到它收到响应,以便其他虚拟线程可以执行。
long start = System.currentTimeMillis();
CountDownLatch countDownLatch = new CountDownLatch(1_000_000);
for (int i=0;i<1_000_000;i++) {
    Thread normalThread = new Thread(() -> {
        System.out.println("Hello, World from Regular Thread : " + Thread.currentThread().getName());
        number.incrementAndGet();
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        countDownLatch.countDown();
    });
    normalThread.start();
}
countDownLatch.await();
long end = System.currentTimeMillis();
System.out.println("Time Taken = "+(end - start));
System.out.println("Number = "+number.get());
AtomicInteger number = new AtomicInteger(0);
CountDownLatch countDownLatch = new CountDownLatch(1_000_000);
long start = System.currentTimeMillis();
for (int i=0;i<1_000_000;i++) {
    Thread.startVirtualThread(() -> {
        System.out.println("Hello, World from Virtual Thread");
        number.incrementAndGet();
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        countDownLatch.countDown();
    });
}
countDownLatch.await();
long end = System.currentTimeMillis();
System.out.println("Time Taken = "+(end - start));
System.out.println("Number = "+number.get());

结论

这显然并不意味着可以盲目地将所有现有线程替换为虚拟线程。然而,这开启了新的思维方式,即在Java中再次可以为每个任务创建虚拟线程。这意味着使用虚拟线程的Web服务器可以根据请求创建虚拟线程,而不必担心JVM内存耗尽。

点赞收藏
Pyqdzzj

怀抱着空杯心态,接纳、学习新技术、新领域!

请先登录,查看3条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

【译】什么是线程dump文件,我们又该如何分析?

【译】什么是线程dump文件,我们又该如何分析?

【全网首发】追求性能极致:Redis6.0的多线程模型

【全网首发】追求性能极致:Redis6.0的多线程模型

读完 RocketMQ 源码,我学会了如何优雅的创建线程

读完 RocketMQ 源码,我学会了如何优雅的创建线程

基于JDK源码解析Java领域中的并发锁,我们可以从中学习到什么内容?

基于JDK源码解析Java领域中的并发锁,我们可以从中学习到什么内容?

【译】Java、Go 和 Python三种语言的多线程性能比较

【译】Java、Go 和 Python三种语言的多线程性能比较

夯实Java基础,一篇文章全解析线程问题

夯实Java基础,一篇文章全解析线程问题

6
3