Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java并发新篇章:虚拟线程与绿线程的演进与调度模型深度解析_创想鸟

Java并发新篇章:虚拟线程与绿线程的演进与调度模型深度解析

Java并发新篇章:虚拟线程与绿线程的演进与调度模型深度解析

java发模型历经演进,从早期的用户态绿线程(m:1调度)到现代的平台线程(1:1调度),再到java 19引入的虚拟线程(m:n调度)。本文将深入探讨绿线程与虚拟线程的核心差异,分析它们各自的调度机制、优缺点及适用场景,并阐明虚拟线程如何有效克服绿线程的局限性,为java应用带来更高的并发吞吐量和更简化的异步编程体验。

Java并发的线程模型演进

在现代软件开发中,并发是构建高性能、高吞吐量应用的关键。Java作为一门广泛使用的编程语言,其并发模型也随着硬件和操作系统技术的发展而不断演进。理解不同线程类型及其调度机制,对于优化并发应用至关重要。

平台线程:操作系统原生支持的线程

在深入探讨绿线程和虚拟线程之前,我们首先需要理解平台线程(Platform Threads),也被称为原生线程或OS线程。平台线程是Java虚拟机(JVM)对操作系统提供的原生线程的封装。每个Java平台线程都直接映射到一个操作系统线程。

调度模型: 1:1 调度。这意味着一个Java平台线程对应一个操作系统线程。特点:由操作系统内核负责调度,能够充分利用多核处理器。创建和销毁成本较高,上下文切换开销较大。数量受操作系统资源限制,通常不适合创建数百万级别的并发任务。适用场景: CPU密集型任务,或者需要与操作系统进行深度交互的场景。

绿线程:早期的用户态线程尝试 (M:1 调度)

绿线程(Green Threads)是Java早期版本(例如Java 1.1)中实现的一种用户态线程。它们完全由JVM管理,不直接依赖操作系统的原生线程。

调度模型: M:1 调度。这意味着多个绿线程运行在一个单独的操作系统线程上。特点:创建和销毁成本低,上下文切换开销小,因为它们在用户空间内管理。主要局限: 由于所有绿线程共享一个操作系统线程,任何一个绿线程执行阻塞I/O操作(例如网络请求、文件读写)都会导致整个操作系统线程阻塞,进而阻塞所有运行在该操作系统线程上的绿线程。这极大地限制了并发性能,尤其是在I/O密集型应用中。无法有效利用多核处理器,因为它们最终都运行在一个操作系统线程上。历史: 随着操作系统原生线程的成熟和普及,以及多核处理器的兴起,绿线程因其性能瓶颈和无法充分利用硬件资源而被Java后续版本放弃,转而采用平台线程。

虚拟线程:现代化的轻量级并发 (M:N 调度)

Java 19作为预览特性引入,并在Java 21中正式发布的虚拟线程(Virtual Threads),是JDK提供的一种轻量级线程实现。它们同样是用户态线程,旨在解决平台线程的资源消耗问题,并克服绿线程的局限性。

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

调度模型: M:N 调度。这意味着大量的虚拟线程被调度到数量较少的平台线程(在虚拟线程的语境中,这些平台线程被称为“载体线程”或“Carrier Threads”)上运行。特点:极度轻量: 虚拟线程的内存占用非常小,可以创建数百万甚至数亿个虚拟线程,远超平台线程的限制。高吞吐量: 当虚拟线程执行阻塞I/O操作时,JVM会“卸载”该虚拟线程,允许其载体线程去执行其他就绪的虚拟线程。当I/O操作完成后,该虚拟线程会被重新挂载到可用的载体线程上继续执行。这种非阻塞调度机制极大地提高了I/O密集型应用的吞吐量。简化编程: 虚拟线程保留了传统线程的同步编程模型,开发者可以像编写同步代码一样编写异步高效的代码,避免了回调地狱或复杂的异步框架。充分利用多核: 通过M:N调度,虚拟线程可以动态地在多个载体线程之间切换,从而充分利用多核处理器的计算能力。如何克服绿线程的局限:绿线程的M:1模型意味着一个阻塞会影响所有。虚拟线程的M:N模型则允许当一个虚拟线程阻塞时,其载体线程可以立即切换到执行另一个未阻塞的虚拟线程,从而避免了整个操作系统线程的停滞。虚拟线程通过将大量轻量级任务映射到有限的平台线程池上,实现了高并发和资源高效利用。

调度模型对比总结

下表总结了不同线程类型的主要特点和调度模型:

Ai Mailer Ai Mailer

使用Ai Mailer轻松制作电子邮件

Ai Mailer 49 查看详情 Ai Mailer

线程类型 描述 Java线程(M) : 操作系统线程(N)

平台线程JVM对操作系统原生线程的封装。1:1绿线程早期Java版本中的用户态线程。M:1虚拟线程Java 19+引入的轻量级用户态线程。M:N (M >> N)

虚拟线程的实际应用与优势

虚拟线程特别适用于I/O密集型应用,例如Web服务器、数据库连接池、消息队列消费者等。在这些场景中,任务大部分时间都在等待I/O操作完成,而不是进行CPU计算。通过使用虚拟线程,可以:

显著提高并发吞吐量: 以更少的平台线程处理更多的并发请求。降低资源消耗: 每个虚拟线程的堆和内存占用极小。简化并发编程 开发者无需使用复杂的异步API(如CompletableFuture),可以直接使用传统的synchronized、Lock等同步原语,代码可读性更高。

示例代码:创建和使用虚拟线程

创建虚拟线程非常简单,通常通过Thread.ofVirtual()工厂方法或Executors.newVirtualThreadPerTaskExecutor()实现:

import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;public class VirtualThreadExample {    public static void main(String[] args) throws InterruptedException {        // 方法一:使用Thread.ofVirtual().start()直接创建并启动        Thread.ofVirtual().name("my-virtual-thread-1").start(() -> {            System.out.println("Hello from virtual thread 1: " + Thread.currentThread());            try {                Thread.sleep(100); // 模拟I/O阻塞            } catch (InterruptedException e) {                Thread.currentThread().interrupt();            }        });        // 方法二:使用ThreadFactory创建        ThreadFactory virtualThreadFactory = Thread.ofVirtual().name("my-virtual-thread-", 0).factory();        Thread vt2 = virtualThreadFactory.newThread(() -> {            System.out.println("Hello from virtual thread 2: " + Thread.currentThread());            try {                Thread.sleep(150); // 模拟I/O阻塞            } catch (InterruptedException e) {                Thread.currentThread().interrupt();            }        });        vt2.start();        // 方法三:使用ExecutorService (推荐用于管理大量任务)        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {            for (int i = 0; i  {                    System.out.println("Task " + taskId + " running on virtual thread: " + Thread.currentThread());                    try {                        Thread.sleep(50 + taskId * 10); // 模拟I/O阻塞                    } catch (InterruptedException e) {                        Thread.currentThread().interrupt();                    }                });            }        } // executor.close() 会等待所有任务完成        System.out.println("Main thread finished.");        // 等待虚拟线程执行完成,实际应用中通常不需要手动等待,因为executor会管理        Thread.sleep(300);    }}

运行上述代码,你会发现输出中的线程名显示为VirtualThread[…]/…,表明它们是虚拟线程。即使有Thread.sleep()模拟阻塞,由于虚拟线程的M:N调度特性,它们会高效地在载体线程上切换,不会阻塞整个应用。

注意事项与最佳实践

CPU密集型任务: 虚拟线程主要优势在于I/O密集型任务。对于CPU密集型任务,平台线程仍然是更优的选择,因为虚拟线程在CPU计算时仍然会占用一个载体线程,过多的CPU密集型虚拟线程反而可能导致上下文切换开销增加。同步原语: 虚拟线程可以使用传统的synchronized关键字和java.util.concurrent.locks包中的锁。然而,过度使用重量级锁可能导致载体线程的“钉扎”(pinning),即虚拟线程被绑定到特定的载体线程上,限制了其调度灵活性。应尽量减少锁的持有时间,或考虑使用ReentrantLock等非阻塞锁。线程本地存储(ThreadLocal): 虚拟线程也支持ThreadLocal,但由于虚拟线程数量巨大,滥用ThreadLocal可能导致内存消耗增加。监控与调试: 尽管虚拟线程简化了编程,但在生产环境中仍需关注其性能监控和调试,JDK提供了相应的工具支持。

总结

从Java 1.1的绿线程(M:1)到Java 19+的虚拟线程(M:N),Java的并发模型经历了显著的演进。绿线程因其M:1调度模型的固有局限性(尤其是在I/O阻塞和多核利用方面)而被淘汰。虚拟线程则通过M:N调度,巧妙地结合了用户态线程的轻量级优势和平台线程的多核利用能力,有效解决了高并发I/O密集型应用中的伸缩性问题。它们不仅提供了极高的吞吐量,还通过保持同步编程模型极大地简化了开发。虚拟线程的引入,标志着Java在构建高性能、高并发现代应用方面迈出了重要一步,为开发者带来了更强大、更易用的并发工具。

以上就是Java并发新篇章:虚拟线程与绿线程的演进与调度模型深度解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1031742.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何用css框架Tailwind实现按钮组响应式布局
上一篇 2025年12月2日 02:37:40
万磁搜索通道_万磁搜索引擎便捷入口
下一篇 2025年12月2日 02:37:46

相关推荐

  • c盘清理工具哪个好用_好用的C盘清理工具推荐与使用评测

    推荐C盘清理方案:系统自带工具如磁盘清理、存储感知和手动清%temp%目录安全可靠,适合日常维护;第三方工具CCleaner、金舟Windows优化大师、风云C盘清理大师和全能C盘清理专家提供一键深度清理,操作便捷且误删率低;空间分析工具WizTree、SpaceSniffer和TreeSize可可…

    2026年9月22日
    000
  • mysql安装完如何诊断 mysql慢查询分析与优化方法

    要解决 mysql 慢查询问题,首先要开启慢查询日志,其次使用 mysqldumpslow 分析日志,再通过 explain 查看执行计划,最后根据常见优化建议改进 sql 和索引。具体步骤如下:一、修改配置文件或动态开启慢查询日志,并设置阈值和路径;二、使用 mysqldumpslow 工具分析慢…

    2026年9月22日
    100
  • 主板供电相数对CPU超频稳定性的影响:14相 vs. 20相实测

    20相供电主板在超频下表现更稳,实测显示其VRM温度更低、电压波动更小、性能输出更一致,尤其适合极限超频和高负载场景,而14相供电配合优质用料也能满足主流超频需求,普通用户无需盲目追求高相数。 主板供电相数直接影响CPU在高负载和超频状态下的电压稳定性和温度控制。很多人在选择主板时会看到“14相”或…

    2026年9月22日
    200
  • Java中如何区分逻辑错误和系统异常

    系统异常是程序运行中由JVM抛出的RuntimeException,如空指针、数组越界,会导致程序中断并打印堆栈;逻辑错误是程序语法正确但结果不符预期,如条件写反、循环次数错误,不会崩溃但行为异常。两者区别在于是否抛出异常、是否中断执行及调试方式不同,需通过防御性编程、单元测试和日志调试加以防范。 …

    2026年9月22日
    000
  • 歧路旅人2兑换码是什么 八方旅人2最新2025兑换码大全

    歧路旅人2最新通用兑换码:qlyrdldbz2025、qdn4xkcndx、qllrdldbz等,可在游戏内商城直接使用,领取剑士黄金武器皮肤、双倍经验加成及1000叶币,奖励丰富限时有效,先到先得。 无限资源畅玩|游戏辅助工具: 2025年最新可用兑换码汇总如下: 1、兑换码: qlyrdldbz…

    2026年9月22日
    000
  • mysql安装后怎么建表 mysql创建数据表的详细步骤

    mysql安装后怎么建表 mysql创建数据表的详细步骤mysql安装后怎么建表 mysql创建数据表的详细步骤mysql安装后怎么建表 mysql创建数据表的详细步骤mysql安装后怎么建表 mysql创建数据表的详细步骤

    安装完 mysql 后,建表的关键在于先创建数据库并选择使用,然后通过 create table 语句定义表结构。1. 创建数据库:使用 create database mydatabase; 创建数据库;2. 使用数据库:通过 use mydatabase; 选择当前操作的数据库;3. 建表语法:…

    2026年9月22日 用户投稿
    200
  • LINUX怎么查看哪个进程占用了某个端口_LINUX端口占用查询方法

    使用ss或lsof命令可快速查看端口占用情况,如sudo ss -tulnp | grep :端口号或sudo lsof -i :端口号,结合PID进一步通过ps或/proc文件系统定位进程详情。 在Linux系统中,查看某个端口被哪个进程占用,常用的方法是使用命令行工具结合网络和进程信息进行查询。…

    2026年9月22日
    000
  • 夸克浏览器电脑网页版访问入口 夸克官网主页链接地址

    夸克浏览器电脑网页版访问入口是https://www.quark.cn/,用户可直接在浏览器地址栏输入该链接访问,其界面采用极简设计并集成智能搜索、网盘服务与跨设备同步等功能。 立即进入“☞☞☞☞☞点击夸克资源网(永久免费)入口☜☜☜☜☜”; 立即进入“☞☞☞☞☞点击夸克浏览器电脑网页版访问入口☜☜…

    2026年9月22日
    500
  • 抖音小店如何运营?普通人开店选品与推广的实用策略

    抖音小店如何运营?普通人开店选品与推广的实用策略抖音小店如何运营?普通人开店选品与推广的实用策略抖音小店如何运营?普通人开店选品与推广的实用策略抖音小店如何运营?普通人开店选品与推广的实用策略

    新手做抖音小店最现实的问题是没钱投广告和没专业团队,解决方法是抓住选品和推广两个核心环节。一、选品要找市场需求高且利润合理的商品,避开竞争激烈或太冷门的品类,结合多平台数据测试;二、前期重点用“商品卡”推广,通过短视频展示产品使用场景并挂链接引流,成本低且适合测试;三、适当尝试直播积累经验,但不依赖…

    2026年9月22日 用户投稿
    400
  • Spring Boot 应用中的单元测试、Mockito 和集成测试:最佳实践

    第一段引用上面的摘要: 本文旨在帮助初学者理解在 Spring Boot 应用中何时以及如何使用 JUnit、Mockito 和集成测试。我们将探讨这些测试框架在 Controller、Service 和 Repository 层中的应用,并提供示例说明何时使用 Mockito 模拟对象,以及何时使…

    2026年9月22日
    000
  • 如何查询命令所属包 yum provides反向查找

    如何查询命令所属包 yum provides反向查找如何查询命令所属包 yum provides反向查找如何查询命令所属包 yum provides反向查找如何查询命令所属包 yum provides反向查找

    使用 yum provides 可以查找某个命令或文件属于哪个软件包,解决“command not found”问题。1. 使用时建议带上完整路径,如 yum provides /usr/sbin/ifconfig;2. 支持通配符模糊查找,如 yum provides */python3;3. 若…

    2026年9月22日 用户投稿
    000
  • Karate框架中处理带方括号和日期范围的GET请求参数

    本文旨在解决Karate框架中构建包含复杂、带方括号(如filters[start_date])及日期范围的GET请求参数时遇到的URL编码问题。通过对比直接定义查询对象和使用param关键字的方法,详细阐述了如何正确地构造URL,确保参数格式符合预期,从而有效进行API测试。 1. 问题背景与挑战…

    2026年9月22日
    000
  • RAID 0阵列对NVMe SSD性能的提升与数据安全风险分析

    RAID 0通过多NVMe SSD并行提升读写性能,理论速度翻倍且显著优化高负载响应,但无冗余导致任一硬盘故障即全阵列崩溃,数据恢复极难,仅建议用于可接受高风险的临时工作或性能优先场景,并必须配合外部备份。 raid 0通过将数据条带化分布在多个存储设备上,理论上可提升读写性能。在搭配nvme ss…

    用户投稿 2026年9月22日
    200
  • SonyCatalyst如何制作高质量AI视频?专业工具剪辑AI内容的指南

    Sony Catalyst通过素材筛选、视觉修正、色彩校正、细节雕琢与音频优化,将AI生成的粗胚视频精修为具备叙事感与视觉一致性的专业作品,其强大色彩管理、稳定器与降噪工具有效解决AI视频的抖动、噪点、色彩偏差等问题,并支持高分辨率素材处理与跨平台输出,实现AI内容与传统剪辑流程的高效融合。 ☞☞☞…

    2026年9月22日
    000
  • windows11怎么开启或关闭Hyper-V虚拟机_windows11虚拟化功能设置教程

    windows11怎么开启或关闭Hyper-V虚拟机_windows11虚拟化功能设置教程windows11怎么开启或关闭Hyper-V虚拟机_windows11虚拟化功能设置教程windows11怎么开启或关闭Hyper-V虚拟机_windows11虚拟化功能设置教程windows11怎么开启或关闭Hyper-V虚拟机_windows11虚拟化功能设置教程

    首先确认硬件支持并开启CPU虚拟化,再根据系统版本通过图形界面或命令行启用Hyper-V,操作后重启生效,最后使用Hyper-V管理器验证状态。 如果您在使用Windows 11时需要运行虚拟机或兼容特定模拟器,可能需要开启或关闭Hyper-V功能。该功能依赖于系统版本和硬件支持,操作后需重启生效。…

    2026年9月22日 用户投稿
    100
  • VSCode配合Quartus开发FPGA(环境设置教程,提高开发效率)

    使用VSCode配合Quartus开发FPGA可提升效率,核心是结合VSCode的代码编辑功能与Quartus的编译仿真能力。首先安装Quartus、VSCode及Python,再安装VHDL/Verilog插件和Makefile Tools等扩展。配置系统环境变量,将Quartus命令路径加入PA…

    2026年9月22日
    100
  • 日本科幻战斗飞行游戏《G-Rebels》实机宣传片

    日本科幻战斗飞行游戏《G-Rebels》实机宣传片日本科幻战斗飞行游戏《G-Rebels》实机宣传片日本科幻战斗飞行游戏《G-Rebels》实机宣传片日本科幻战斗飞行游戏《G-Rebels》实机宣传片

    日本开发商reakktor studios公开了飞行模拟游戏《g-rebels》的实机宣传视频,该作是一款开放世界战斗飞行模拟游戏,玩家可以一览《g-rebels》中活力四射和密集的城市群,从精英家园伊甸园到饱受战争蹂躏和被海啸淹没的城市威尼斯。 《G-Rebels》将登陆PC Steam平台,目前…

    2026年9月22日 用户投稿
    100
  • 如何在Dask中训练AI大模型?分布式数据处理的AI训练技巧

    如何在Dask中训练AI大模型?分布式数据处理的AI训练技巧如何在Dask中训练AI大模型?分布式数据处理的AI训练技巧如何在Dask中训练AI大模型?分布式数据处理的AI训练技巧如何在Dask中训练AI大模型?分布式数据处理的AI训练技巧

    Dask在处理超大规模数据集时的独特优势在于其Python原生的分布式计算能力,能无缝扩展Pandas和NumPy的工作流,突破单机内存限制,实现高效的数据预处理与模型训练。它通过惰性计算、分块处理和内存溢写机制,支持TB级数据的并行操作,相比Spark提供了更贴近Python数据科学生态的API和…

    2026年9月22日 用户投稿
    100
  • 抖音小店网页版怎么登录?抖音我的小店在哪里

    随着抖音电商平台的快速发展,越来越多的商家选择入驻该平台。作为商家运营的重要工具之一,抖音小店网页版为店铺管理带来了诸多便利。那么,如何正确登录抖音小店网页版?又该如何找到“我的小店”?下面将为您详细介绍。 一、为什么需要登录抖音小店网页版? 通过抖音小店网页版,商家可以高效地进行商品管理、订单处理…

    2026年9月22日
    000
  • 如何设置Linux用户磁盘配额 xfs_quota配置完整流程

    如何设置Linux用户磁盘配额 xfs_quota配置完整流程如何设置Linux用户磁盘配额 xfs_quota配置完整流程如何设置Linux用户磁盘配额 xfs_quota配置完整流程如何设置Linux用户磁盘配额 xfs_quota配置完整流程

    linux用户磁盘配额是通过xfs_quota工具配置,以限制用户或组的磁盘空间和文件数量。1. 确认文件系统为xfs并安装xfsprogs;2. 修改/etc/fstab启用usrquota和grpquota后重新挂载;3. 使用xfs_quota初始化数据库;4. 用limit命令设置用户或组的…

    2026年9月22日 用户投稿
    000

发表回复

登录后才能评论
关注微信