Solon v3.8.0

问题:怎样启用 Java21 虚拟线程?

</> markdown
2025年12月24日 上午10:38:32

启用虚拟线程后,http 请求、async 注解处理、部分 job 执行将使用虚拟线程池。

1、通过配置启用(推荐)

solon.threads.virtual.enabled: true #启用虚拟线程池(默认false)

配置好后,如何获取状态(java21+ 环境才有效)?

Solon.cfg().isEnabledVirtualThreads();

更多配置参考:应用常用配置说明

2、更好的使用虚拟线程,还需要 solon-java25

使用虚拟线程三件套:

配套说明备注
启用虚拟线程(java 21 发布)。 通过配置启用Solon v2.7 已支持
不使用锁 synchronized 。 改用 ReentrantLock 或其它锁Solon v2.7 已改进
不使用 ThreadLocal 。 改用 ScopedValue(java 25 发布)Solon v3.8 已适配

更好的使用虚拟线程需要 solon-java25 扩展的提供 ScopedValue(java21 预览,java25 发布) 适配:

添加依赖包:

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-java25</artifactId>
</dependency>

切换适配工厂 ScopeLocalJdk25(默认采用 ScopeLocalJdk8),切换后还可以支持跨线程JDBC事务。

public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args, app->{
            //替换 ScopeLocal 接口的实现(基于 java25 的 ScopedValue 封装)
            app.factories().scopeLocalFactory(ScopeLocalJdk25::new);
        });
    }
}