JDK21 虚拟线程:能完全代替传统线程吗?聊聊 Web 应用中的场景适配

news2025/3/10 11:03:35

虚拟线程到底是个什么东西?

虚拟线程的出现,可以说是 Java 并发编程的一次“大手术”。本质上,它是对 线程模型的抽象和轻量化

  • 传统线程:由操作系统管理,每个线程需要分配较大的栈空间(通常 1MB),线程切换涉及用户态和内核态切换,开销较高。
  • 虚拟线程:由 JVM 层面管理,栈空间动态分配,仅需几 KB,切换是在用户态完成,性能显著提升。

虚拟线程不是“平地起高楼”,它最终仍然运行在少量的平台线程(操作系统线程)之上,由 ForkJoinPool(或类似机制)负责调度。这种调度是协作式的,也就是说,虚拟线程会在 I/O 阻塞、锁等待 或 主动让出时间片 时,释放底层线程资源。


虚拟线程 vs 平台线程:Web 应用场景下的对比

1. N 个请求时的调度公平性

  • 传统线程模型
    每个请求对应一个平台线程,操作系统通过时间片轮转调度线程,确保请求响应不会被某些线程“霸占”,即便某些请求耗时较长,其他请求也能获得执行机会。
  • 虚拟线程模型
    虚拟线程的调度是由 ForkJoinPool 实现的,它通过 工作窃取算法 来平衡负载。遇到阻塞操作时,虚拟线程会 挂起并释放底层线程,让其他任务继续执行。这种设计非常适合 I/O 密集型任务,因为虚拟线程不会浪费载体线程的资源。

问题关键
你提到的“后续请求响应时间是否会变长”,其实取决于以下两个条件:

阻塞的类型和时长

    • 如果是网络 I/O 阻塞,虚拟线程能够轻松让出资源,其他请求不会受影响。
    • 但如果是长时间占用 CPU 的计算任务,则所有虚拟线程都要抢占有限的底层线程,这可能导致后续请求被延迟。

底层线程的数量

    • ForkJoinPool 默认的线程池大小与可用 CPU 核心数一致(Runtime.getRuntime().availableProcessors())。如果你的任务中存在大量计算操作,底层线程可能会成为瓶颈。

2. I/O 密集型任务的性能

这是虚拟线程的强项。对于典型的 Web 应用(如 HTTP 请求处理),大部分任务时间花在等待网络 I/O 或数据库响应上。虚拟线程的协作式调度让阻塞操作变得“廉价”,你可以轻松创建成千上万个虚拟线程,处理大规模并发连接,而不会耗尽系统资源。

举个例子:
假如你有 10,000 个请求等待数据库查询结果。使用传统线程模型,可能需要创建 10,000 个操作系统线程,这会导致线程切换开销和内存占用暴涨。而虚拟线程的轻量级设计可以显著减少这些开销。

3. CPU 密集型任务的限制

虚拟线程在 CPU 密集型任务中优势不大,因为这类任务的瓶颈在于物理 CPU 核心的数量,而非线程调度的效率。在这种情况下,无论是虚拟线程还是平台线程,都会面临相同的资源争夺问题。

如果你的 Web 应用中混合了 I/O 密集型和 CPU 密集型任务,建议:

  • 为虚拟线程配置单独的线程池,而非默认的 ForkJoinPool。
  • 将 CPU 密集型任务交由传统线程池处理,避免阻塞 ForkJoinPool 的载体线程。

虚拟线程能完全替代传统线程吗?

虚拟线程的优势

I/O 密集型场景下的高并发能力

    • 轻量化设计,支持海量线程。
    • 协作式调度,阻塞时释放资源。

简化编程模型

    • 彻底消除回调地狱,代码结构更接近同步逻辑,易读易维护。
    • 与传统线程 API 兼容,迁移成本低。

虚拟线程的局限性

CPU 密集型任务:虚拟线程无法突破 CPU 核心数限制,性能不如为计算任务专门设计的线程池。

阻塞载体线程的操作

如果在虚拟线程中调用大量 同步阻塞代码(如传统数据库驱动或线程锁),会占用载体线程资源,影响调度性能。

推荐使用非阻塞 I/O(如 java.nio 或现代异步库)以及尽量减少锁竞争。

ThreadLocal 的管理
虚拟线程会动态映射到底层线程,频繁切换可能导致 ThreadLocal 不再适用,需要特别注意资源的生命周期管理。


如何避免响应时间过长的问题?

合理配置 ForkJoinPool

    • 增加 ForkJoinPool 的线程数(通过 java.util.concurrent.ForkJoinPool.commonPool 配置),确保载体线程不被长时间占用。

优化任务分类

    • 将 CPU 密集型任务和 I/O 密集型任务分开,分别使用传统线程池和虚拟线程池处理。

虚拟线程是银弹吗?

虚拟线程的确在 I/O 密集型任务中表现出色,可以极大简化代码并提升并发性能。但它并不是万能的,在某些情况下(如 CPU 密集型任务或同步阻塞操作)仍需要传统线程模型配合使用。

一句话总结:虚拟线程是并发编程的新利器,但要想真正提升性能,还是得根据实际场景权衡,合理搭配虚拟线程和传统线程。

制作不易,如有帮助,记得点赞关注~ 我是旷野,探索无尽技术!

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

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

相关文章

《Vue3实战教程》13:Vue3侦听器

如果您有疑问,请观看视频教程《Vue3实战教程》 侦听器​ 基本示例​ 计算属性允许我们声明性地计算衍生值。然而在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态。…

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址:https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64,一直下一步,选择安装的路径位置,一直下一步就安装完成了。打开Anaconda PowerShell Promp…

如何在NGINX中实现基于IP的访问控制(IP黑白名单)?

大家好,我是锋哥。今天分享关于【如何在NGINX中实现基于IP的访问控制(IP黑白名单)?】面试题。希望对大家有帮助; 如何在NGINX中实现基于IP的访问控制(IP黑白名单)? 1000道 互联网大…

16.springcloud_openfeign之父子容器

文章目录 前言springcloud中的父子容器基础知识了解springcloud提供父子容器的支持springcloud_openfeign对父子容器的应用 总结 前言 在前面springcloud_openfeign的文章中了解到FeignClientsRegistrar在扫描到满足条件的feign接口后会生成BeanDefinition并注入到spring上下文…

写入hive metastore报问题Permission denied: user=hadoop,inode=“/user/hive”

背景 使用Doris创建hive catalog后,想在hive上的库中创建一个表,报如下图片错误 解决办法 hdfs dfs -ls /看到如下图片所示,只有root用户有写的权限 所以通过export HADOOP_USER_NAMEroot将hadoop的用户名改成root,然后再hdfs…

【AI图像生成网站Golang】项目测试与优化

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与优化 六、项目测试与优化 在开发过程中,性能优化是保证项目可扩展性和用户体验的关键步骤。本文将详细介绍我如何使用一…

单节点calico性能优化

在单节点上部署calicov3273后,发现资源占用 修改calico以下配置是资源消耗降低 1、因为是单节点,没有跨节点pod网段组网需要,禁用overlay方式网络(ipip,vxlan),使用route方式网络 配置calico-node的环境变量 CALICO_IPV4POOL_I…

Redis 中 IntSet 底层数据结构

IntSet 底层数据结构 序言: 像字符串 SDS 只是保存了一个变量的值,但是像 Redis 中也是需要保存一些集合元素的,这里就介绍一下其中一种集合 IntSet,由于是 Set 所以也有 Set 的一些特性,不过也多加了一些特性: ● 唯…

Java——网络编程(下)

(UDP通讯的实现) 1 UDP通信介绍 (面向无链接的一个传输协议——>不会创建连接——>效率高) (发送数据要经行封包操作——>使用DatagramPacket类——>底层是UDP) (DatagramPacket——>数据封包——>发送数据和接收数据都要去包装对象!&#xf…

《Django 5 By Example》读后感

一、 为什么选择这本书? 本人的工作方向为Python Web方向,想了解下今年该方向有哪些新书出版,遂上packt出版社网站上看了看,发现这本书出版时间比较新(2024年9月),那就它了。 从2024年11月11日至2024年12月18日期间&…

基于Spring Boot的校园商城系统

一、系统背景与意义 随着互联网技术的快速发展,电子商务已经渗透到生活的方方面面。校园作为一个相对封闭但活跃的社群,同样需要一个专门的线上平台来满足其特殊的需求。基于Spring Boot的校园商城系统正是为此目的而设计,它结合了微服务架构…

感知机收敛性定理证明

1. 问题描述 感知机收敛性定理假设: 存在一个参数向量 θ(被归一化为单位向量,,以及一个正数 ,使得对所有训练样本 满足: 这是线性可分的假设,意味着每个样本点与正确超平面之间有一个至少为的…

ai绘图丨中国新年春节背景第二弹(附关键词

使用工具:千鹿AI 咒语:圆形平面讲台,5 个礼品盒和台灯交错排列,红色背景上的圆形,中国唐朝风格,红色和金色主题,3D 效果图,摄影棚灯光,简约产品展示模型,逼真…

深度学习每周学习总结J9(Inception V3 算法实战与解析 - 天气识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结Inception V1 简介Inception V3 简介1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1…

Restaurants WebAPI(一)—— clean architecture

文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…

道路运输企业安全生产管理人员安全考核试题

道路运输企业安全生产管理人员安全考核试题 一、单选题 题干:在公交车行驶过程中,乘客王某因与驾驶员发生矛盾,遂殴打驾驶员并抢夺方向盘,造成其他乘客受轻微伤,依照《中华人民共和国刑法》的规定,王某触…

FFmpeg库之ffplay

文章目录 FFmpeg环境搭建ffplay使用通用选项视频选项音频选项快捷键使用滤镜直播拉流 FFmpeg环境搭建 FFmpeg官网 FFmpeg环境搭建 ./configure \--prefix"$HOME/ffmpeg" \--extra-cflags"-I$HOME/ffmpeg/include" \--extra-ldflags"-L$HOME/ffmpeg…

HTTP 协议报文结构 | 返回状态码详解

注:本文为 “HTTP 历史 | 协议报文结构 | 返回状态码” 相关文章合辑。 未整理去重。 HTTP 历史 wangjunliang 最后更新: 2024/3/16 上午10:29 超文本传输协议(英语:HyperTextTransferProtocol,缩写:HTTP)是 万维网(World Wide Web)的基础协议。自 蒂姆…

springboot444新冠物资管理系统的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装新冠物资管理系统软件来发挥其高效地信息处理的作用&#x…

【数字信号处理】数字信号处理试题及答案,离散序列,Z变换,傅里叶变换

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…