如何在 Spring Boot 中使用虚拟线程?

Unlock business potential through effective first dataset management solutions.
Post Reply
suchona.kani.z
Posts: 246
Joined: Sat Dec 21, 2024 5:46 am

如何在 Spring Boot 中使用虚拟线程?

Post by suchona.kani.z »

java.util.concurrent.Executors 类还定义了创建 ExecutorService 的方法,该服务为每个任务启动一个新的虚拟线程。

要使用虚拟线程,您需要 JDK 21 和 Spring Boot 3。

在 Spring Boot 3.2 中
在 Spring Boot 3.2 中,您只需将以下属性添加到 application.properties 文件即可启用虚拟线程。此设置适用于嵌入式 Tomcat 和 Jetty。

在 Spring Boot 3.1 中
对于 Spring Boot 3.1 及更早版本,可以使用以下配置来使用嵌入式 Tomcat:



如何在 Quarkus 中使用虚拟线程?
自 2022 年 6 月发布 2.10 版本以来,Quarkus 已经支持 Jakarta EE 11 中定义的 @RunOnVirtualThread 注释。

在 Quarkus 中使用虚拟线程非常简单。为此可。这告诉 Quarkus 在虚拟线程而不是常规平台线程上运行带注释的方法。


使用虚拟线程的陷阱
避免同步块/方法
如果虚拟线程在阻塞操作期间绑定到它的载体,则无法将其与其载体分离。这种情况发生在以下情况:

虚拟线程在同步块或方法中执行代码。
虚拟线程执行本机方法或外部函数(请参阅外部函数和内存 API)。
绑定不会使应用程序出错,但可能会影 制造电邮清单 响其可扩展性。通过检查频繁执行的同步块或方法并使用 java.util.concurrent.locks.ReentrantLock 保护可能冗长的 I/O 操作,尝试避免频繁且长期的绑定。

避免使用线程池来限制资源访问
如果使用执行器,则可以创建无限数量的虚拟线程。如果需要限制虚拟线程的数量,则不应创建池而应使用信号量。

减少ThreadLocal的使用
如果您的应用程序创建了数百万个虚拟线程,并且每个虚拟线程都有自己的 ThreadLocal 变量,那么这会很快耗尽 Java 堆空间。因此,仔细考虑有多少数据存储为 ThreadLocal 变量非常重要。

虚拟线程为我们提供了什么
虚拟线程的优点
轻量级:可以批量创建虚拟线程而不影响性能。
构建成本效益高:不再需要池虚拟线程,从而简化了实现。
阻塞的成本效益高:阻塞虚拟线程在执行 I/O 操作时不会影响底层操作系统线程。
更低的内存要求:虚拟线程使用的内存明显少于平台线程,从而显着提高性能。
更低的CPU使用率: JVM对虚拟线程的调度效率更高,并且比OS线程导致的CPU使用率更少。
更快的上下文切换:与内核线程相比,虚拟线程可以实现更快的上下文切换,因为它们由 JVM 管理。
改进的吞吐量和延迟:使用虚拟线程通过允许单位时间处理更多请求来增加 Web 服务器的吞吐量,并通过减少处理时间来改进延迟。
使用虚拟线程的优点
显着减少工作量:用于编写、维护和监控高吞吐量并发应用程序。
每个请求线程编程风格的新生命:这可以实现近乎最佳的硬件利用率扩展。
与现有 Thread API 完全兼容:这使得现有的应用程序和库可以通过最小的更改得到支持。
支持现有的调试和分析接口:使用现有的工具和技术可以轻松地对虚拟线程进行故障排除、调试和分析。
虚拟线程与平台线程
用于对虚拟线程和平台线程之间的响应时间进行比较分析的测试设置非常简单。它只需要一种模拟 CPU 和内存负载的方法。我们的测试使用一个简单的类来模拟负载。任务是创建一个带有随机数的 ArrayList,这些随机数将被排序和打乱。
Post Reply