本文主要是介绍SpringBoot3中使用虚拟线程的完整步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细...
1. 环境准备
JDK 21+:确保安装 JDK 21 或更高版本
Spring Boot 3.2+:最低要求(pom.XML 或 build.gradle)
<!-- Maven 依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <!-- 或更高版本 --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
// Gradle 依赖 plugins { id 'Java' id 'org.springframework.boot' version '3.2.0' } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' }
2. 配置虚拟线程
方式一:全局启用虚拟线程(Tomcat/Jetty)
import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.Executors; @Configuration public class VirtualThreadConfig { // Tomcat 配置(默认服务器) @Bean public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() { return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); } // Jetty 配置(如使用Jetty) // @Bean // public JettyVirtualThreadsCustomizer jettyVirtualThreadsCustomizer() { // KQyUjmsyreturn new JettyVirtualThreadsCustomizer(); // } }
方式二:异步任务使用虚拟线程
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; @Configuration @EnableAsync public class AsyncConfig { @Bean(name = "virtualThreadExecutor") public Executor virtualThreadExecutor() { return Thread.ofVirtual().name("virtual-", 0).factory()::newThread; } }
使用异步方法:
@Service public class AsyncService { @Async("virtualThreadExecutor") // 指定执行器 public CompletableFuture<String> asyncTask() { // 模拟耗时I/O操作 return CompletableFuture.completedFuture("Virtual thread task completed"); } }
3. 验证javascript虚拟线程
测试控制器
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.CompletableFuturKQyUjmsye; @RestController public class TestController { @GetMapping("/thread") public String getThreadType() { // 打印当前线程信息 Thread thread = Thread.currentThread(); return """ js Thread name: %s Is virtual: %s Platform thread: %s """.formatted( thread.getName(), thread.isVirtual(), thread.isVirtual() ? "N/A" : thread.toString() ); } @GetMapping("/sleep") public CompletableFuture<String> sleep() throws InterruptedException { Thread.sleep(1000); // 模拟I/O阻塞 return CompletableFuture.completedFuture( "Done by: " + Thread.currentThread().getName() ); } }
4. 启动应用
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
5. 测试验证
1.访问 http://localhost:8080/thread 查看线程类型:
Thread name: virtual-0
Is virtual: true
Platform thread: N/A
2.并发测试(使用 ab 或 JMeter):
ab -n 1000 -c 200 http://localhost:8080/sleep
观察低内存占用和高吞吐量
6.关键注意事项
阻塞操作识别:
- 虚拟线程在 synchronized 块或本地方法调用时会固定到平台线程
- 使用 jcmd <PID> Thread.dump_to_file -format=json <file> 分析线程状态
线程局部变量:
- 虚拟线程支持 ThreadLocal,但避免滥用(可能增加内存压力)
- 考虑使用 ScopedValue(Java 21+)
数据库连接池:
// application.properties spring.datasource.hikari.thread-factory=java.util.concurrent.ThreadFactory
调试配置:
java -Djdk.tracePinnedThreads=full -jar your-app.jar
7.完China编程整配置示例(Tomcat + HikariCP)
@Configuration public class VirtualThreadGlobalConfig { // Tomcat 虚拟线程执行器 @Bean TomcatProtocolHandlerCustomizer<?> tomcatVirtualThreads() { return handler -> handler.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); } // HikariCP 使用虚拟线程工厂 @Bean @ConfigurationProperties("spring.datasource.hikari") public HikariDataSource dataSource() { return new HikariDataSource(new HikariConfig() {{ setThreadFactory(Thread.ofVirtual().factory()); }}); } // 异步任务执行器 @Bean Executor virtualThreadExecutor() { return Executors.newVirtualThreadPerTaskExecutor(); } }
重要提示:虚拟线程最适合 I/O 密集型场景(如网络请求、数据库调用),对计算密集型任务提升有限。生产环境务必进行压力测试!
到此这篇关于SpringBoot3中使用虚拟线程的完整步骤的文章就介绍到这了,更多相关SpringBoot3使用虚拟线程内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于SpringBoot3中使用虚拟线程的完整步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!