新闻详情

新闻详情

首页 / 资讯中心 / 详情

Java虚拟线程(三)

发布时间:2026/10/2 14:00:26来源:尧图网络
Java虚拟线程(三)
虚拟线程会不会和线程池争抢资源一句话结论要看两者底层载体来源。SpringBoot Web 虚拟线程 和 你自己写的普通平台线程池默认不会争抢但如果你的业务虚拟线程执行器和自定义平台线程池共用同一个 ForkJoinPool就会争抢载体线程资源。1. 底层载体回顾虚拟线程本身不占用 OS 线程执行时需要载体线程Carrier Thread载体本质就是平台线程来自 JDK 内置的ForkJoinPool.commonPool()。Java21虚拟线程默认载体池就是 commonPoolExecutors.newVirtualThreadPerTaskExecutor()提交任务 → 由 JDK 的 commonPool 提供载体线程普通ThreadPoolExecutor/newFixedThreadPool自己单独创建一批平台线程独立于 commonPool场景 1SpringBoot Web 虚拟线程容器 VT 业务自定义平台线程池✅互不争抢载体资源SpringBoot3.2 开启spring.threads.virtual.enabledtrue时Tomcat 的载体线程是 Tomcat 自己维护的平台线程池不是 JDK 的 commonPool。你代码里另外写的newFixedThreadPool又是独立的平台线程集合。三者是完全独立的 OS 线程集合资源隔离不存在互相抢。例Tomcat 载体 max200业务有个固定线程池核心 10。这 200 个 10 个是操作系统上不同的平台线程互不抢占。场景 2业务虚拟线程newVirtualThreadPerTaskExecutor 自定义平台线程池✅ 平台线程池是独立线程不会抢载体池❌业务虚拟线程之间会争抢 JDK commonPool 的载体线程commonPool 有默认并行度默认 CPU 核心数。当大量虚拟线程同时处于可运行状态非 IO 阻塞CPU 密集它们会抢 commonPool 里有限的载体线程。重点区分两个状态VT 在 IO 阻塞sleep、socket、jdbc释放载体让出 commonPool 线程不抢VT 处于 RUNNABLECPU 计算持续占用载体线程此时大量 VT 会争抢 commonPool 有限载体发生排队。举例子CPU 8 核commonPool 默认并行度 8。1000 个虚拟线程提交 CPU 密集任务同一时刻最多只有 8 个在跑剩下 992 个 VT 排队抢载体。表现和固定 8 线程池效果几乎一样。场景 3自己用 ForkJoinPool 作为载体创建虚拟线程不推荐// 自定义ForkJoinPool作为虚拟线程载体池 ForkJoinPool customPool new ForkJoinPool(4); ThreadFactory vtFactory Thread.ofVirtual().scheduler(customPool).factory();此时所有虚拟线程载体来自你这个 customPool如果你同时拿这个 customPool 去跑普通 ForkJoin 任务虚拟线程和普通 ForkJoin 任务会争抢这个池内的平台线程。2. 高频误区澄清误区 1虚拟线程数量多会抢占 CPU把平台线程池压垮不完全准确IO 阻塞的虚拟线程不占用载体不消耗 CPU再多也不会抢平台线程池资源只有可运行状态的虚拟线程才会占用载体线程和同载体池内其他任务争抢 CPU。误区 2开启 Web 虚拟线程后不能再使用线程池❌ 完全可以混用。 最佳实践IO 阻塞类Web 请求虚拟线程CPU 密集任务单独自定义平台线程池核心数 CPU 核不要交给虚拟线程跑避免抢占 commonPool 载体。3. 生产上的资源争抢风险点1. 大量 CPU 密集型代码跑在虚拟线程里大量可运行 VT 抢占 commonPool 载体导致其他虚拟线程任务得不到载体响应变慢。✅ 解决CPU 密集任务剥离到独立平台线程池。2.commonPool 被虚拟线程打满影响框架底层依赖 commonPool 的组件很多第三方库底层会使用ForkJoinPool.commonPool()。如果业务虚拟线程把 commonPool 占死会导致这些组件任务排队。✅ 解决自定义 ForkJoinPool 作为业务虚拟线程的 scheduler隔离载体池不和 JDK 公共池共用。示例// 单独给业务虚拟线程分配载体池隔离资源 private static final ForkJoinPool vtCarrierPool new ForkJoinPool(20); ExecutorService businessVtExecutor Executors.newThreadPerTaskExecutor( Thread.ofVirtual().scheduler(vtCarrierPool).factory() );3.操作系统层面所有平台线程载体线程 自定义线程池都要争抢 CPU 时间片不管是不是同一个池所有 OS 平台线程最终都会竞争 CPU。这个是操作系统层面调度不属于 “虚拟线程和线程池争抢载体资源” 范畴。4. 总结对比表组合场景是否争抢载体线程说明SpringBoot Tomcat 虚拟线程 业务自定义 ThreadPoolExecutor❌ 不抢载体池相互独立业务 newVirtualThreadPerTaskExecutor 自定义 ThreadPoolExecutor❌ 不抢VT 载体来自 commonPool自定义线程池是独立 OS 线程业务虚拟线程 其他使用 commonPool 的任务✅ 争抢共用同一个 ForkJoinPool 载体池虚拟线程和普通任务共用同一个自定义 ForkJoinPool✅ 争抢共用载体池资源互相抢占5. 总结虚拟线程本身不占用 OS 线程执行依赖载体平台线程。SpringBoot Web 虚拟线程载体是 Tomcat 独立线程池和我们手动创建的平台线程池互不抢占但是newVirtualThreadPerTaskExecutor默认载体来自 JDK commonPool。如果大量虚拟线程是 CPU 密集任务这些就绪虚拟线程会争抢 commonPool 里有限载体线程所以生产建议CPU 密集任务放到独立平台线程池如果业务虚拟线程量很大可以单独指定自定义 ForkJoinPool 做载体池隔离资源避免和 JDK 公共池任务争抢。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Manus 收购案被叫停背后:AI Agent 并购的合规红线与 TaoToken 统一 Key 接入实践 2026/10/2 16:21:31

Manus 收购案被叫停背后:AI Agent 并购的合规红线与 TaoToken 统一 Key 接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
用AI(Claude+Trae)一周开发微信小程序:TaoToken统一Key接入与uni-app+Vue3实战大纲 2026/10/2 16:21:30

用AI(Claude+Trae)一周开发微信小程序:TaoToken统一Key接入与uni-app+Vue3实战大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
锚板厚度及开孔边距的尺寸要求? 2026/10/2 16:21:30

锚板厚度及开孔边距的尺寸要求?

锚板厚度及开孔边距的尺寸要求?锚栓技术用于锚栓固定于混凝土基材中。按现行规范《混凝土结构后锚固技术规程》JGJ 145 - 2013要求,锚栓内力按以下基本假定进行计算:1.被连接件与基材结合面受力变形后仍保持为平面,锚板平面外弯曲…

阅读更多 →
2026年DeepSeek写论文被查出AI怎么办?用TaoToken统一Key接入这3款检测工具帮你搞定 2026/10/2 16:21:30

2026年DeepSeek写论文被查出AI怎么办?用TaoToken统一Key接入这3款检测工具帮你搞定

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
办公 AI 助手怎么选:用 TraeWork 验证从资料到交付的完整工作流|TaoToken 统一 Key 接入 2026/10/2 16:21:29

办公 AI 助手怎么选:用 TraeWork 验证从资料到交付的完整工作流|TaoToken 统一 Key 接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Android 获取联系人姓名和电话号码信息:TaoToken 统一 Key 接入实战 2026/10/2 16:21:17

Android 获取联系人姓名和电话号码信息:TaoToken 统一 Key 接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉