JDK 21 虚拟线程相关知识简介

什么是虚拟线程

  • 虚拟线程是一种轻量级线程,也可以称为协程。它是一种抽象的概念,可以理解为在程序中同时执行多个线程的并发执行。虚拟线程是由Java虚拟机(JVM)来实现的,它并不与特定的操作系统线程绑定,而是通过虚拟线程的调度来实现并发执行。
  • 虚拟线程的调度由JVM负责,与平台线程有很大的不同。虚拟线程的状态管理、任务提交、休眠和唤醒等也是完全由JVM实现。虚拟线程适用于运行大部分时间被阻塞的任务,这些任务通常需要等待I/O操作的完成,例如网络请求和数据库查询等。
  • 虚拟线程与平台线程不同,通常只有一个浅调用堆栈,例如只执行一次HTTP请求或者一次JDBC查询。虚拟线程也支持线程局部变量,因为单个JVM可能支持数百万的虚拟线程。然而,虚拟线程并不适用于长时间运行的CPU密集型操作。
  • 虚拟线程是一种抽象的概念,通过Java虚拟机来实现并发执行,适用于需要等待I/O操作的任务,但并不适用于长时间运行的CPU密集型操作。

虚拟线程的作用

  • 区别于虚拟线程,传统的线程对象叫做平台线程(platform thread)。平台线程在底层 OS 线程上运行 Java 代码,并在代码的整个生命周期中占用该 OS 线程,因此平台线程的数量受限于 OS 线程的数量。虚拟线程是 java.lang.Thread 的一个实例,它在底层 OS 线程上运行 Java 代码,但不会在代码的整个生命周期中占用该 OS 线程。也就是说,多个虚拟线程可以在同一个 OS 线程上运行其 Java 代码,可以有效地共享该线程。平台线程独占宝贵的 OS 线程,而虚拟线程则不会,因此虚拟线程的数量可以比 OS 线程的数量多得多,执行阻塞任务的整体吞吐量也就大了很多。

  • 但如果上述任务不是简单的sleep 1s,而是计算了1s(例如做矩阵计算或数组排序等),用线程池和虚拟线程的执行时间区别就没有那么大。原因是虚拟线程虽然可以带来更大的吞吐量,但并不能让单个任务计算得更快,当使用平台线程执行任务已经让cpu没有任何空闲时,切换虚拟线程来执行也不会带来任何收益。

  • 虚拟线程可以发挥的最大作用是,可以让采用单请求单线程(thread-per-request)的方式编写的服务器程序最大化地利用CPU计算资源 。 其原因在于服务器程序有两大特点,一是需要处理较大吞吐量的请求,二是请求处理的过程大多是由IO密集型逻辑组成,这就导致采用平台线程实现的单请求单线程编写方式,可能会有大量的IO阻塞占据了平台线程资源,从而不能充分利用CPU资源。我们在使用真实应用压测时观察到,当服务请求IO耗时增大时,使用虚拟线程的吞吐量会明显高于线程池,尤其是当服务下游依赖出现故障导致耗时增大时,虚拟线程带来的服务可用性提升会非常明显。

  • 有些情况下,服务端开发者为了充分利用cpu硬件资源,会考虑放弃单请求单线程的编程风格,而采用基于netty、actor等异步框架来构建服务。这样虽然它消除了由于OS线程稀缺性带来的吞吐量限制,但代价很高:它需要异步编程风格,没有专用线程,开发人员必须将请求处理逻辑分解成小阶段,通常是lambda表达式或独立的回调handler对象,然后使用API将它们组合成一个顺序管道(例如CompletableFuture或响应式框架),在一定程度上放弃了代码的顺序执行逻辑和代码的可读性。

  • 在异步风格中,请求的每个阶段可能在不同的线程上执行,每个线程以交替方式运行属于不同请求的阶段。这对于理解程序行为有很大的影响:堆栈跟踪不能提供可用的上下文,debug无法跟踪请求处理逻辑,而分析工具无法将请求处理与其调用者相关联。总的来说,除了底层服务框架和一些特定的功能性服务,大部分以业务开发为主导的服务器程序都不会采用这种编程风格进行逻辑开发

虚拟线程的工作原理

  • 线程需要被调度才能执行任务,本质上是分配到CPU上执行。对于由操作系统线程实现的平台线程,JDK 依赖于操作系统中的调度程序;而对于虚拟线程,JDK 先将虚拟线程分配给平台线程,然后平台线程按照通常的方式由操作系统进行调度。

  • 调度器分配给虚拟线程的平台线程称为虚拟线程的载体线程(carrier)。虚拟线程可以在其生命周期内会被安排在不同的载体线程上。换句话说,调度器不维护虚拟线程和平台线程之间的亲和关系。从 Java 代码的角度来看,运行中的虚拟线程在逻辑上独立于其当前载体线程

  • 载体线程的信息对虚拟线程不可见,Thread.currentThread() 返回的值始终是虚拟线程本身。

  • 载体线程和虚拟线程的堆栈跟踪是分开的。在虚拟线程中抛出的异常将不包括载体线程的堆栈帧。线程dump不会在虚拟线程的堆栈中显示载体线程的堆栈帧,反之亦然。

  • 载体线程的thread-local变量对虚拟线程不可用,反之亦然。

  • 从 Java 代码的角度来看,开发者不能感知到虚拟线程和其载体线程临时共享了一个操作系统线程。但从本地代码(native code)的角度来看,虚拟线程和其载体在同一个本地线程上运行。因此,在同一虚拟线程上多次调用的本地代码可能会观察到不同的操作系统线程标识符。

注意事项

  • JDK中绝大多数的阻塞操作(如LockSupport、网络库API、大部分IO操作)都会卸载虚拟线程,释放其载体线程和底层操作系统线程以执行其他虚拟线程。然而,JDK中有一些阻塞操作不会卸载虚拟线程,从而阻塞其载体线程和底层操作系统线程,这是因为操作系统层面(例如许多文件系统操作)或JDK层面(例如Object.wait())的限制。为了解决这些阻塞操作的问题,虚拟线程调度器会通过暂时扩展并行度来弥补平台线程被占用,因此在调度程序的ForkJoinPool中,平台线程的数量可能暂时超过可用处理器的数量,可以通过系统属性jdk.virtualThreadScheduler.maxPoolSize来调整调度器可用的平台线程的最大数量。

但有两种情况下虚拟线程在阻塞操作期间不能卸载,而是被固定(pinned)在其载体线程上:

  1. 当虚拟线程在 synchronized 代码块或方法中执行代码时

  2. 当它执行本地方法(native method )或外部函数(foreign function)时

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

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

相关文章

UDP的特点及应用场景

目录 UDP特点 应用场景 总结 User Datagram Protocol(UDP,用户数据报协议)是互联网协议套件中的一种传输层协议。与TCP不同,UDP是一种无连接的、不可靠的协议。 UDP特点 要知道UDP可以用来做什么,首先我们要知道它…

UE Web Remote Control

前言 最近在研究UE自启WEB服务和网页通信以此来通过网页与UE进行数据交互,这样最好的方式就是可以摒弃掉整个繁琐的通信连接流程如TCP UDP,但是找到的一些方法都不是很适用,尤其是WEBUI这个插件它只适合内嵌到UE本身才能完成交互,…

LeetCode(37)矩阵置零【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 73. 矩阵置零 1.题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]…

仓储货架生产厂家|拥有编码器+激光传感器的海格里斯HEGERLS料箱式四向穿梭车

随着高新科技的迅猛发展,仓储物流行业已慢慢朝着无人化、自动化、智能化、密集化方向快速发展,用户的需求量也随之日益提升。在众多仓储物流设备中,四向穿梭车越来越得到各大中小企业所青睐和投入使用。四向穿梭车不但具有良好的可延性与适配…

2022年土地出让数据,超多字段,附数据可视化

分享一个土地出让数据,详细信息如下: 数据名称: 2022年土地出让数据 数据格式: Shp、excel 数据时间: 2022年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源:网络公开数据 部分字段如下: 如需获取可搜“吧唧数…

【面试心经】——上海广升智能科技有限公司

介绍 本文记录的是2018.5月份应聘上海广升linux 开发岗位的经历。 福利待遇: BOSS 岗位薪资:15K ~25K。 每月一天带薪病假或事假。 国家规定外有额外4天年假。 每年两次旅游,上半年国外,下半年国内。 每年两次调薪机会&…

get 请求获取最新缓存

// request拦截,在请求发起前搞事情 service.interceptors.request.use((config) > {const url config.urlif (config.method get) {url.indexOf(?) -1 ? config.url url ?_ (new Date().getTime()) : config.url url &_ (new Date().getTime())}if (getTok…

Ultipa参加国际科学会议KGSWC2023

近日,领先的国际科学会议 KGSWC 2023,在西班牙萨拉戈萨大学召开,Ultipa Graph参加。 KGSWC2023是第五届伊比利亚-美洲会议和第四届印度-美洲知识图谱与语义网大会的联合论坛。自2019年成立以来,KGSWC一直是一个重要的学术活动&am…

测试工程师核心软技能「情绪管理」

大家好呀,我是楼仔。 我之前经常提到一句话:大多数时候所谓的“技术之玻璃天花板”,其实只是缺乏软技能而已。 所以粉丝朋友们,我们除了需要关注技术,更需要注重软技能的提高。 关于软技能相关的文章,之…

婚恋小程序APP一站式开发搭建丨幸福全方位婚恋一线牵丨相亲交友婚恋小程序使用手册丨实名认证丨语音交友丨源码交付,支持二开丨同城交友

1: 如何在相亲交友婚恋小程序寻找属于自己的幸福 打开相亲交友婚恋小程序, 在首页遇到自己喜欢的人, 点击详情, 然后点击喜欢, 如果对方也喜欢你, 互相喜欢成功, 可以在缘分页看到对方的微信, 添…

基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…

Android Studio Giraffe-2022.3.1-Patch-3安装注意事项

准备工作: android studio下载地址:https://developer.android.google.cn/studio/releases?hlzh-cn gradle下载地址:https://services.gradle.org/distributions/ 比较稳定的网络环境(比较android studio相关的依赖需要从谷歌那边…

部分WiFi相关的术语

LAN:即局域网,是路由和主机组成的内部局域网,一般为有线网络。 WAN:即广域网,是外部一个更大的局域网。 WLAN(Wireless LAN,即无线局域网):前面我们说过LAN是局域网&am…

Redis集群模式

Redis集群主要有三种模式 主从复制模式(Master-Slave)、哨兵模式(Sentinel)和Cluster模式 主从复制模式:适用于数据备份和读写分离场景,配置简单,但在主节点故障时需要手动切换。哨兵模式&…

Google分析中的基础概念

当提到Google分析时,我们通常指的是一种用于跟踪和分析网站和应用程序数据的工具。在使用Google分析之前,了解其基础概念对于正确配置和有效使用该工具非常重要。 1、帐户(Account):帐户是Google分析中的最高层级。一…

【网络安全】-安全常见术语介绍

文章目录 介绍1. 防火墙(Firewall)定义通俗解释 2. 恶意软件(Malware)定义通俗解释 3. 加密(Encryption)定义通俗解释 4. 多因素认证(Multi-Factor Authentication,MFA)定…

WordPress 外链跳转插件

WordPress 外链跳转插件是本站开发的一款WordPress插件,能对文中外链添加一层过滤,有效防止追踪,以及提醒用户。 类似于知乎、CSDN打开其他链接的提示。 后台可以设置白名单 学习资料源代码:百度网盘 密码:123

【飞桨星河社区五周年线下工坊-杭州站】

? 欢迎大家参加杭州极客工坊,深入了解大模型前沿技术和创新应用,一站式体验AI原生应用开发? 精彩议程敬请期待~ ? 时间:2023年12月3日 14:00-17:30 ? 地点:杭州西湖区花蒋路3号西溪润泽园度假酒店 ? 主题&#xf…

Pytorch中的Net.train()和 Net.eval()函数讲解

目录 前言1. Net.train()2. Net.eval()3. 总结 前言 这两个方法通常用于训练和测试阶段 1. Net.train() 该代码用在训练模式中 主要作用: 模型启用了训练时特定的功能(Batch Normalization 和 Dropout)。 在这种模式下,模型会根…

2021年1月12日 Go生态洞察:探索Go中泛型的提议

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…