SpringBoot中启用虚拟线程

1. 什么是虚拟线程

虚拟线程是JDK21版本正式发布的一个新特性。虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为“虚拟”。这种解耦是由JVM提供的抽象层赋予的。

虚拟线程的运行成本远低于平台线程。它们消耗的内存要少得多。这就是为什么我们可以创建数百万个虚拟线程而不会出现内存不足的问题,而标准平台(或内核)线程只能创建数百个。

因此,我们可以无需依赖异步代码即可管理高度可扩展的应用程序。

2. 代码实战

在SpringBoot项目中创建MyThreadConfig

@EnableAsync
@Configuration
public class MyThreadConfig {
    @Bean
    public AsyncTaskExecutor applicationTaskExecutor() {
        return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
    }

    @Bean
    public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
        return protocolHandler -> {
            protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
        };
    }
}

上述代码主要是将SpringBoot内置的线程池修改为虚拟线程。第一个Spring Bean(ApplicationTaskExecutor)将取代标准的ApplicationTaskExecutor,提供一个 Executor,为每个任务启动一个新的虚拟线程。第二个 Bean 命名为 ProtocolHandlerVirtualThreadExecutorCustomizer,它将以同样的方式定制标准的 TomcatProtocolHandler


注意在SpringBoot3.2.0版本后可以通过配置方式application.yml开启

spring:
  threads:
    virtual:
      enabled: true

3. 总结

项目改用虚拟线程后,HTTP请求降低30%的耗时,用户体验更佳。

posted @ 2023-10-21 10:30  护发师兄  阅读(955)  评论(0编辑  收藏  举报