Java21虚拟线程

https://openjdk.org/jeps/425

平台线程和虚拟线程

传统线程称为平台线程,映射到操作系统线程,平台线程更昂贵,启动/停止速度更慢,必须处理上下文切换(按其数量放大),并且依赖于操作系统。操作系统无法提高平台线程的效率,但 JDK 可以通过切断其线程与操作系统线程之间的一对一关系来更好地利用它们。

虚拟线程是java.lang.VirtualThread对象实例,继承自java.lang.Thread。通过以下方式创建虚拟线程:

// 平台线程
Thread.ofPlatform().start(() -> {
    // Runnable
});

// 创建虚拟线程
Thread.ofVirtual().start(() -> {
    // Runnable
});

虚拟线程需要操作系统线程的CPU来执行任务,但不会占用操作系统线程来等待其他资源。当虚拟线程中运行的代码调用 JDK API 中的阻塞 I/O 操作时,运行时会执行非阻塞操作系统调用,并自动暂停虚拟线程,直到操作完成。在此期间,其他虚拟线程可以在该操作系统线程上执行计算,因此这些虚拟线程实际上是在共享该操作系统线程。

平台线程的创建有限制,例如:大多数Java Servlet服务器使用具有一定线程数量限制的线程池,比如tomcat线程池的默认最大线程数是200。而虚拟线程开销极小,不受操作系统的限制,因此可以有很多很多个虚拟线程。

public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < 1_000_000; i++) {
        Thread.startVirtualThread(() -> {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
    }
    TimeUnit.MINUTES.sleep(3);
}

Fibers, virtual threads, coroutines

https://en.wikipedia.org/wiki/Fiber_(computer_science)

goroutines

池化虚拟线程

池化只对昂贵的资源有意义,而虚拟线程并不昂贵。相反,每当需要同时执行任务时,都可以创建新的虚拟线程。线程池可以使用来限制对某些资源的访问,例如对数据库的请求。但是在这种限制资源访问的场景,使用信号量来确保只有指定数量的线程正在访问该资源更为合适,

因此无需池化虚拟线程 虚拟线程占用的资源很少,可以大量创建而无须考虑池化,不需要跟平台线程池一样,平台线程的创建成本比较昂贵,所以通常选择使用线程池,但是池化操作本身会引入额外开销,对于虚拟线程池化反而是得不偿失。

参考资料

  1. https://stackoverflow.com/questions/72116652/what-exactly-makes-java-virtual-threads-better
  2. https://rockthejvm.com/articles/the-ultimate-guide-to-java-virtual-threads
  3. https://stackoverflow.com/questions/9964899/why-are-os-threads-considered-expensive
  4. https://en.wikipedia.org/wiki/Virtual_thread
  5. https://blogs.oracle.com/javamagazine/post/java-loom-virtual-threads-platform-threads
posted @ 2025-08-06 23:24  vonlinee  阅读(39)  评论(0)    收藏  举报