0

0

Java 21虚拟线程环境如何搭建_尝鲜新特性环境配置要求

P粉602998670

P粉602998670

发布时间:2026-03-08 08:43:02

|

319人浏览过

|

来源于php中文网

原创

java 21虚拟线程需jdk 21+并启用--enable-preview,使用thread.ofvirtual().start()创建,避免start/join,推荐structuredtaskscope进行结构化并发管理。

java 21虚拟线程环境如何搭建_尝鲜新特性环境配置要求

Java 21 虚拟线程需要什么 JDK 版本和启动参数

必须用 jdk-21 或更高版本(如 jdk-21.0.1),JDK 20 及更早版本不支持虚拟线程,哪怕加了 --enable-preview 也没用。OpenJDK、Oracle JDK、Eclipse Temurin 都行,但得确认是完整构建版——某些精简版(如某些 Alpine Docker 镜像里的 jdk21-jre-headless)可能缺 java.lang.VirtualThread 类。

启动时必须显式开启预览特性:--enable-preview。虚拟线程在 Java 21 中仍是预览特性(直到 Java 22 才转正),漏掉这个参数会直接抛 UnsupportedOperationException 或连 Thread.ofVirtual() 都找不到。

  • 正确启动命令示例:java --enable-preview -jar app.jar
  • 如果用 IDE(如 IntelliJ),需在 Run Configuration → VM Options 里手动加上 --enable-preview,不能只改 Project SDK 版本
  • Maven 编译也要配预览:在 maven-compiler-plugin 中设 <source>21</source><target>21</target>,并加 <compilerargs><arg>--enable-preview</arg></compilerargs>

如何写第一个虚拟线程代码,避开 IllegalThreadStateException

别直接调 start()join() ——虚拟线程不是传统线程,Thread.start() 会报 IllegalThreadStateException。它必须由 Thread.Builder 构造,且默认是“自动调度”模式,你只负责提交任务,不管理生命周期。

最安全的写法是用 Thread.ofVirtual().unstarted(Runnable) 或更常见的 Thread.ofVirtual().start(Runnable)

立即学习Java免费学习笔记(深入)”;

LogoAi
LogoAi

利用AI来设计你喜欢的Logo和品牌标志

下载
Thread vt = Thread.ofVirtual().start(() -> {
    System.out.println("运行在虚拟线程: " + Thread.currentThread());
});
  • 不要对虚拟线程调 vt.join(),它可能永远阻塞(尤其在平台线程池未配置好时);要用 vt.join(5000) 带超时,或改用结构化并发(见下一条)
  • 避免在虚拟线程里调 Thread.sleep()Object.wait() ——虽然能跑,但会退化成挂起平台线程,失去轻量优势
  • 虚拟线程默认不继承上下文类加载器,若依赖 Thread.currentThread().getContextClassLoader(),得手动传入或设置

结构化并发(StructuredTaskScope)为什么不能省

裸用 Thread.ofVirtual().start() 容易失控:异常没捕获、线程泄漏、超时难管理。Java 21 引入的 StructuredTaskScope 是唯一推荐的协调方式,它强制作用域边界和异常传播规则。

比如并发请求 3 个 HTTP 接口,用 StructuredTaskScope.ShutdownOnFailure 可确保任一失败就取消其余任务:

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    scope.fork(() -> fetchUser());
    scope.fork(() -> fetchOrder());
    scope.fork(() -> fetchPayment());
    scope.join(); // 等全部完成或任一失败
    scope.throwIfFailed(); // 抛出首个异常
}
  • 必须用 try-with-resources,否则 scope.close() 不触发,子任务可能卡住
  • StructuredTaskScope 默认使用 ForkJoinPool.commonPool() 调度虚拟线程,别试图换 Executors.newVirtualThreadPerTaskExecutor() ——它不兼容结构化语义
  • 作用域内抛出的 unchecked exception 会被捕获,但 checked exception(如 IOException)需显式处理或包装,否则编译不过

常见报错:java.lang.UnsupportedOperationException: Virtual threads are not supported

这通常不是 JDK 版本问题,而是运行时环境没启用虚拟线程支持。典型场景有三类:

  • Spring Boot 3.1+ 默认禁用虚拟线程,需在 application.propertiesspring.threads.virtual.enabled=true,否则 WebMvc 或数据源层会静默回退到平台线程
  • Tomcat/Jetty 的 Servlet 容器若未升级到支持虚拟线程的版本(如 Tomcat 10.1.12+),HTTP 请求仍跑在平台线程上,Thread.currentThread().isVirtual() 返回 false
  • 某些监控/诊断代理(如旧版 ByteBuddy、部分 APM 工具)会拦截 Thread 构造,导致虚拟线程创建失败,需检查 agent 日志是否含 VirtualThread 相关拒绝记录

验证是否真在虚拟线程里执行,最简单方法是加一行日志:System.out.println(Thread.currentThread().isVirtual()); ——别只看启动参数或文档,实测才是唯一标准。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

117

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

172

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

157

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

244

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.9万人学习

Java 教程
Java 教程

共578课时 | 78.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号