Spring boot 使用虚拟线程示例

项目使用版本

  • 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();
    }

}

演示结果

  • 控制台打印信息

image

  • 请求响应信息

image

posted @ 2025-11-04 15:56  程序员の奇妙冒险  阅读(21)  评论(0)    收藏  举报