了解Java的"虚拟线程":"行动Java 21"中的轻量级通由性引入了虚拟线程作为稳定特征(JEP 444),从根本上改变了我们在JVM上接近通由性的方式.
在本文中,我们将探索虚拟线程是什么,它们为什么重要,以及如何有效地使用.
平台线索的问题 传统的Java线程——现在称为平台线程——是操作系统线程周围的薄薄包裹.
每个都消耗了大约1MB的堆栈内存,并涉及OS排程器进行上下文切换.
这使得它们变得昂贵:java // 创建上千个平台线程是昂贵的 (int i = 0; i < 10 000;i++) {新线程 (( () -) > { / 阻断 I/O 连接到 OS 线程进程请求 (;) ). start ();}} 在高通量服务器应用中,经典"每个请求"模式会打出一个天花板,因为你根本无法创建足够的OS线程.
输入Virtual Threads 虚拟线程由JVM而非OS管理.
许多虚拟线程运行在一个小池的载体平台线程上.
当一个虚拟线程块(例如在I/O上)时,JVM从它的载体中解开它,使该载体自由运行其他虚拟线程.
木卫一 // 创建一百万个虚拟线程是完美的尝试( var executor = executers. newVirtualThreadPerTaskExecutor ()) { intStream.range (0, 1 000 000). forEach(i- > {executor.sumit ( ()-) > { Thread.sleep (deser.of Seconds (1); return i; }}}} 关键惠益 廉价创建:虚拟线程从一个小堆起,随需求而增长.
更熟悉的模型:你写直截了当的屏蔽代码——没有回调或反应链.
更好的可扩展性:通过量受到资源的限制,而不是线程计数.
使用 Spring Boot As of Spring Boot 3.2中的虚拟线索,启用虚拟线索是一行配置变化:属性 spring.threads.virtual.uplied= true 这使得Tomcat在虚拟线程上处理每个请求,允许您的应用程序服务于许多同时阻塞的请求而无需耗尽线程池.
您也可以明确地创建虚拟线程: java Thread vThread = Thread.of Virtual (). name ("worker-", 0). start ( () - > system.out.println ("Running on " + Thread.currentThread (")"); vThread.join (); Pitchfalls to Watch For Pinning:当一个虚拟线程在被阻断的呼叫中在一个块内运行时,它会一直被固定在它的载体上.
偏好封锁区段.
不要将它们集合:虚拟线程的用意是每个任务创建,而不是集合和再利用.
CPU捆绑的工作:虚拟线程为I/O捆绑的任务发光;它们对于纯CPU的计算没有什么好处.
虚拟线程允许您写出简单,屏蔽的代码,可以缩放到数百万个并行任务.
与Spring Boot的无缝集成相结合,它们为现代服务器应用程序提供了一个令人信服的升级路径——不需要被动重写.
在你的下一个项目中给他们一个尝试 并享受可读货币的规模.