Spring BootJavaSpring Boot
2025-11-04 15:56阅读:113评论:0
Spring boot 使用虚拟线程示例
项目使用版本 Spring Boot v3.5.6 jdk 25 配置 创建 VirtualThreadConfig 配置类 创建演示服务接口 创建controller 演示结果 控制台打印信息 image 请求响应信息 image
_PROTECTED0_PROTECTED3_PROTECTED1_PROTECTED4_PROTECTED2__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Configuration@EnableAsyncpublic class VirtualThreadConfig { @Bean(name = "virtualThreadExecutor") public TaskExecutor virtualThreadExecutor() { return new TaskExecutorAdapter( Executors.newVirtualThreadPerTaskExecutor() ); } @Bean(name = "threadPoolTaskExecutor") public TaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setThreadNamePrefix("my-pool-"); executor.initialize(); return executor; } /** @Async 默认使用虚拟线程,需要在yml中配置,此配置的目的是@Async 是否默认使用虚拟线程可配置 * spring: * threads: * virtual: * enabled: true */ @Bean @ConditionalOnProperty(value = "spring.threads.virtual.enabled", havingValue = "false") public AsyncTaskExecutor applicationTaskExecutor() { return new SimpleAsyncTaskExecutor(); }} _PROTECTED0__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Servicepublic class DemoThreadService { // 使用虚拟线程 @Async("virtualThreadExecutor") public CompletableFuture<String> demoVirtualThreadExecutor() { System.out.println("是否为虚拟线程:" + Thread.currentThread().isVirtual() + " 线程名称:" + Thread.currentThread().getName()); return CompletableFuture.completedFuture( "虚拟线程 " + new Random().nextInt(1000) ); } @Async("threadPoolTaskExecutor") public CompletableFuture<Integer> demoThreadPoolTaskExecutor() { System.out.println("是否为虚拟线程:" + Thread.currentThread().isVirtual() + " 线程名称:" + Thread.currentThread().getName()); return CompletableFuture.completedFuture( new Random().nextInt(1000) ); }} _PROTECTED0__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestControllerpublic class DemoController { @Resource private DemoThreadService demoThreadService; @GetMapping("/demo") public String hello() throws InterruptedException, ExecutionException { CompletableFuture<String> fetchExternalData = demoThreadService.demoVirtualThreadExecutor(); demoThreadService.demoThreadPoolTaskExecutor(); return "Hello, World! ===> " + fetchExternalData.get(); } }