JDK21虚拟线程和线程池性能对比

442 阅读1分钟

概述

虚拟线程和线程池在性能上的对比主要体现在资源利用率、上下文切换开销、可伸缩性和编程复杂性等方面。

对比

特性虚拟线程线程池
资源利用率高,虚拟线程消耗的系统资源较少资源消耗较高,尤其是大规模并发时
上下文切换开销低,虚拟线程的上下文切换开销较低高,物理线程的上下文切换开销较高
可伸缩性优秀,可以轻松创建成千上万的虚拟线程有限,线程池中线程数量一般是有限的
编程复杂性低,无需管理线程池,编程更简洁高,需要管理线程池和线程的生命周期
适用场景高并发I/O密集型应用CPU密集型任务或需要控制线程数量的场景
调度由JVM管理,更智能的调度由开发者管理,需手动调优
启动时间快,虚拟线程启动时间一般较短相对较慢,物理线程启动时间较长
垃圾回收影响较小较大,特别是在大量创建和销毁线程时

示例代码

虚拟线程示例

public class VirtualThreadExample {
    public static void main(String[] args) {
        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 0; i < 10000; i++) {
                executor.submit(() -> {
                    // Task to be executed
                    System.out.println("Task executed by: " + Thread.currentThread());
                });
            }
        }
    }
}

线程池示例

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10000; i++) {
            executor.submit(() -> {
                // Task to be executed
                System.out.println("Task executed by: " + Thread.currentThread());
            });
        }
        executor.shutdown();
    }
}

选择建议

通常情况下,虚拟线程通常是更好的选择,特别是在需要处理大量并发任务时,虚拟线程的高伸缩性和低资源消耗使其成为更优的方案。