You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.2应用已配置虚拟线程但未生效,仍创建大量平台线程求助

Spring Boot 3.2应用已配置虚拟线程但未生效,仍创建大量平台线程求助

嘿,我之前碰到过一模一样的问题,咱们一步步捋清楚问题出在哪,然后搞定它!虚拟线程的生效可不是光开个开关就完事,很多细节没注意到的话,平台线程还是会偷偷跑出来。

首先,确认Tomcat容器是否真的用虚拟线程处理请求

Spring Boot 3.2默认不会把Tomcat的请求处理线程池换成虚拟线程,这是很多人踩坑的地方!你需要手动配置Tomcat的协议处理器,让它用虚拟线程来处理HTTP请求:

@Configuration
public class TomcatVirtualThreadConfig {
    @Bean
    public TomcatProtocolHandlerCustomizer<?> protocolHandlerCustomizer() {
        return protocolHandler -> {
            // 给Tomcat配置虚拟线程任务执行器
            protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
        };
    }
}

如果这步没做,你的控制器请求还是会跑在Tomcat的平台线程池里,虚拟线程自然没机会发挥作用。

然后,修复RestClient的底层客户端配置

你现在用的是默认的RestClient,它底层依赖JDK的HttpClient,但默认情况下JDK HttpClient用的是平台线程池处理IO操作。哪怕你的控制器跑在虚拟线程里,RestClient发起请求时还是会占用平台线程,导致大量创建。

给RestClient配置一个使用虚拟线程的HttpClient就能解决:

@Configuration
public class ClientConfig {

    @Bean
    public RestClient weatherServiceClient(@Value("${weather.service.url}") String baseUrl) {
        // 创建用虚拟线程执行IO的HttpClient
        HttpClient jdkHttpClient = HttpClient.newBuilder()
                .executor(Executors.newVirtualThreadPerTaskExecutor())
                .build();
        // 绑定到RestClient的请求工厂
        JdkClientHttpRequestFactory requestFactory = new JdkClientHttpRequestFactory(jdkHttpClient);
        
        return RestClient.builder()
                .baseUrl(baseUrl)
                .requestFactory(requestFactory)
                .build();
    }
}

最后,排查其他潜在的平台线程来源

除了上面两点,你还可以检查这些地方:

  • 有没有用@Async或者@Scheduled的任务?如果没指定虚拟线程执行器,这些任务还是会用平台线程池
  • 用jstack工具dump线程栈,看看那些平台线程的名称和调用栈,比如http-nio-*开头的是Tomcat的平台线程,jdk-http-client-*是JDK HttpClient的平台线程,这样能精准定位剩余的问题点

按照这几步配置完,你应该会看到平台线程的数量大幅下降,虚拟线程的优势就能体现出来啦!

备注:内容来源于stack exchange,提问作者René Winkler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:49:31