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

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

1年前
416236
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条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

实现定时任务的六种策略

实现定时任务的六种策略

浅析AbstractQueuedSynchronizer

浅析AbstractQueuedSynchronizer

6
3