项目使用版本
- Spring Boot v3.5.6
- jdk 25
配置
创建 VirtualThreadConfig 配置类
@Configuration
@EnableAsync
public 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();
}
}
创建演示服务接口
@Service
public 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)
);
}
}
创建controller
@RestController
public 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();
}
}
演示结果

