Redian新闻
>
JKD 21 中出现虚拟线程,开创并发新纪元

JKD 21 中出现虚拟线程,开创并发新纪元

公众号新闻

作者 | A N M Bazlur Rahman
译者 | 马可薇
策划 | 丁晓昀

JEP 444 虚拟线程已从 JDK 21 的候选(Candidate)升至建议实现 状态(Proposed to Target)。该功能提供虚拟线程这一轻量级线程,可大幅削减在 Java 平台上高吞吐量并发应用的编写、维护及观察的工作量。根据在 JDK 20 中交付的 JEP 436 虚拟线程(第二次预览),在 JDK 19 中交付的 JEP 425 虚拟线程(预览),这前两轮的反馈,本次 JEP 预计将最终敲定该项功能。

随着这一 JEP 的加入,Java 将有传统线程(又名平台线程)和虚拟线程两种类型的线程存在。平台线程是对操作系统线程的一对一封装,而虚拟线程则是由 JDK 所提供的轻量级实现,可在同一条操作系统线程中运行多条虚拟线程。虚拟线程提供了比平台线程更为有效的替代方案,允许开发者以肉眼可见的低开销处理大量任务,与此同时,这类线程也受益于增强的性能和资源利用率,提供对已有 Java 代码的兼容性和无缝迁移路径。以下面这段代码为例:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {    IntStream.range(0, 10_000).forEach(i -> {        executor.submit(() -> {            Thread.sleep(Duration.ofSeconds(1));            return i;        });    });}

目前,在低至一个的操作系统(OS)线程上,JDK 可运行高达一万个并发虚拟线程,执行这段让程序睡眠一秒钟的简单代码。

虚拟线程的设计让其可与线程本地的变量、可继承线程本地的变量共同运作,这点与平台线程相同。但由于虚拟线程的可创建数量上限非常高,开发者在使用线程本地变量时应当多留心。至于虚拟线程的迁移,JDK 所提供的系统属性 jdk.traceVirtualThreadLocals 可在虚拟线程设置任何线程本地变量值时,触发堆栈跟踪。

程序包 java.util.concurrent 现已包含对虚拟线程的支持。LockSupport API 也已更新,可优雅暂停(park)或恢复(unpark)虚拟线程,允许 锁(Lock)、Semaphores、阻塞队列 等使用 LockSupport 的 API 与虚拟线程无缝连接。

其中,Executors.newThreadPerTaskExecutor(ThreadFactory)Executors.newVirtualThreadPerTaskExecutor() 方法,可通过 ExecutorService为每个任务创建一个新线程,在利好迁移的同时,也让使用线程池的已有代码具备与 ExecutorService 的互操作性。

java.netjava.nio.channels 包中的网络 API 现已支持虚拟线程,使并发应用更为高效。虚拟线程中的阻塞操作可释放底层平台线程,而 SocketServerSocketDatagramSocket 类中的 I/O 方法也已改为可中断)。本次更新为并发应用的 Java 开发者们提供了更好的一致性行为和性能。

用于字节流和字符 API 的 java.io 包也已更新,避免在使用虚拟线程时被锁定。虚拟线程中的锁定是指轻量级线程“被困”于某个平台线程而导致的阻塞操作,从而限制了线程的并发性和灵活性。此外, BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriterPrintStreamPrintWriter 在直接使用时,已将原先的监视器锁改为显式锁。InputStreamReaderPrintWriter 所使用的流解码器与编码器现也已改为与其对应的流关闭 InputStreamReaderOutputStreamWriter 使用相同的锁。

Java 本地接口(JNI)引入用于检测对象是否为虚拟线程的新函数 IsVirtualThread。除此之外,JNI 规范没有其他变化。

由 JVM 工具接口(JVM TI)、Java 调试协议(JDWP),及 Java 调试接口所(JDI)组成的调试架构现已更新,可支持虚拟线程。其中三个接口均已支持虚拟线程,且增加了用于处理线程开始和结束事件、虚拟线程批量暂停恢复的新功能和方法。

JDK 飞行记录器(JFR)现已支持虚拟线程的新事件,诸如 jdk.VirtualThreadStartjdk.VirtualThreadEndjdk.VirtualThreadPinned,以及jdk.VirtualThreadSubmitFailed。上述这些事件均提供了对应用程序内虚拟线程行为的洞察力。

Java 管理扩展(JMX)仍旧通过ThreadMXBean 接口 支持平台线程。HotSpotDiagnosticsMXBean  接口中新方法将生成该新增线程类型的转储,从而支持虚拟线程。

虽然虚拟线程为我们带来了显著的性能改善,但开发者仍应注意对已有 API 及其实现的更改可能造成的兼容性问题,如对 java.io 包中内部锁协议的修订,任何扩展 Thread类的代码源码可能存在与二进制不兼容的问题,等等。

虚拟线程的引入标志着 Java 在支持高并发和可扩展应用道路上的里程碑式进展。随着这一更为高效且更为轻量级的线程模型的出现,开发者现已可以轻松处理数以百万级的任务量,对系统资源的利用也更为充分。关于 JEP 425 的更多开发者细节,请参见 InfoQ 新闻及 Oracle 公司 Java 平台组的 Java 开发者倡导 José Paumard 在 JEP Café 的演讲截屏。

原文链接:

JEP 444: Virtual Threads Arrive in JDK 21, Ushering a New Era of Concurrency(https://www.infoq.com/news/2023/04/virtual-threads-arrives-jdk21/)

相关阅读:

Java 近期新闻:字符串模板、Quarkus、Open Liberty、PrimeFaces、JobRunr、Devnexus 2023(https://www.infoq.cn/article/gB3ToN16f0iPC3tvdpDZ)

加入有序集合,Java 集合框架变得更加完善 (https://www.infoq.cn/article/PyfmlboNJMKzlhZTwDL3)

声明:本文为 InfoQ 翻译,未经许可禁止转载。

点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!

今日好文推荐

谷歌用机器人大规模删除代码:二十多年积累了数十亿行,已删除5%C++代码

开发者的好日子要来了?苹果即将在iOS 17迎来大变化

一次电梯故障,“逼得”这个程序员在29岁时写出了 Rust

花8年转型微服务却得不到回报,问题出在哪儿?

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
【谝闲分享】:再写一篇有关我家老三。小心!加州街头惊现虚假停车罚单,千万别上当小心!美国街头惊现虚假停车罚单,千万别上当Build 2023 | 主题演讲与200+课程邀你共同开启AI新纪元!并发提升20+倍、单节点数万QPS,Apache Doris高并发特性解读命中注定!脑中出现“神秘声音”结果中100万美元大奖「数字钥匙云」开启新纪元看吐!3000万粉丝网红正在直播,食物中出现蟑螂,网友:她无视提醒继续带货!本人发文道歉埃尔多安直播采访中出现突发情况北极光中出现浅蓝色螺旋 专家揭秘关于并发编程与线程安全的思考与实践麻了,代码改成多线程,竟有9大问题KDE 团队正在开发新的电子书管理应用:Arianna | Linux 中国Two Of Us|南北梦幻联动,开启电音新纪元并发提升 20+ 倍、单节点数万 QPS,Apache Doris 高并发特性解读如果交往中出现这样的沉默,你要留心了《狂飙》中出现一堆AD钙奶,哇哈哈董事长有意见小心!这种“蝎子”随时在你家中出现⋯⋯《狂飙》中出现一堆AD钙奶镜头,娃哈哈董事长回应:没广告植入但我有意见…JDK 21中的结构化并发:并发编程的一次飞跃【成都】线下讲座 | 穿越不确定性, 迈向财务投资规划新纪元中国工程院院士赵沁平:奋力实现虚拟现实1.0到2.0的跨越Prompt一键抠图!Meta发布史上首个图像分割基础模型,开创CV新范式寓意不祥花,无辜任怨嗟细数线程池的10个坑,面试线程不怕不怕啦《狂飙》中出现AD钙,宗庆后:我有意见​惊魂!西捷客机空中出现发动机故障并起火!所幸无人员受伤!医药3.0时代,关注每个普通人,健康科技的新纪元!中产阶级退休的男人如何面对疾病颠覆物理学!美国团队宣布常温超导技术大突破,人类将迎来新纪元他从摩尔根“蝇室”走来,开创了中国遗传学研究春来杉树花粉散,日经狂泄三十年脑中出现"神秘声音"叫她买彩券, 美国女子兑奖发现中100万吓坏没有邓小平右派慢慢长夜无绝期从虚拟人到虚拟人类,虚拟咔咔+ChatGPT,给智能以生命
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。