Java-21推崇的虚拟线程到底有好快?一起来看这个实验

我们一起来看下面这个场景:十万个待执行任务,每个任务休眠两秒

1. 采用java-21的虚拟线程池来实现

    public static void main(String[] args) throws InterruptedException{ExecutorService VIRTUAL_THREAD_POOL = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("Virtual-Thread#", 1).factory());// 定义任务数:十万个int total = 10 * 10000;CountDownLatch cdl = new CountDownLatch(total);long s = System.currentTimeMillis();for (int i = 0; i < total; i++){VIRTUAL_THREAD_POOL.execute(() -> {try{Thread.sleep(2000);}catch (InterruptedException e){e.printStackTrace();}cdl.countDown();});}cdl.await();System.out.println("十万个任务执行完毕,总耗时:" + (System.currentTimeMillis() - s));}

最终输出:

十万个任务执行完毕,总耗时:3632

是的,你没看错,就只花了3.5秒左右,完成了10万个平均需要2秒才能完成的任务!

2. 采用原生线程池的效果

没有对比就没有伤害,我们一起再来看看用原生线程池的效果,大家先不要着急看结果,先猜测下,下面这段代码会发生什么呢?

    public static void main(String[] args) throws InterruptedException{// 定义任务数:十万个int total = 10 * 10000;ExecutorService THREAD_POOL = Executors.newFixedThreadPool(total);CountDownLatch cdl = new CountDownLatch(total);long s = System.currentTimeMillis();for (int i = 0; i < total; i++){THREAD_POOL.execute(() -> {try{Thread.sleep(2000);}catch (InterruptedException e){e.printStackTrace();}cdl.countDown();});}cdl.await();System.out.println("十万个任务执行完毕,总耗时:" + (System.currentTimeMillis() - s));}

输出结果:
在这里插入图片描述是的,你没看错,运行近20秒后,直接内存崩溃了,要知道,我本机内存可是32G的物理机啊!!!都扛不住这10万个原生线程的开销

An unrecoverable stack overflow has occurred.
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x00007fff92212f83, pid=26344, tid=307540
#
# JRE version: OpenJDK Runtime Environment (22.0+36) (build 22+36-2370)
# Java VM: OpenJDK 64-Bit Server VM (22+36-2370, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
# Problematic frame:
# V  [jvm.dll+0x3e2f83][24.301s][warning][os,thread] Failed to start thread "Unknown thread" - _beginthreadex failed (EACCES) for attributes: stacksize: default, flags: CREATE_SUSPENDED STACK_SIZE_PARAM_IS.
[24.301s][warning][os,thread] Failed to start the native thread for java.lang.Thread "pool-1-thread-70502"
Exception in thread "main" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reachedat java.base/java.lang.Thread.start0(Native Method)at java.base/java.lang.Thread.start(Thread.java:1540)at java.base/java.lang.System$2.start(System.java:2582)at java.base/jdk.internal.vm.SharedThreadContainer.start(SharedThreadContainer.java:152)at java.base/java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:953)at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1364)at com.sinhy.virtualthread.TestThreadSpeed2.main(TestThreadSpeed2.java:66)

3. 结论

java-21推崇的虚拟线程,是轻量级线程(类似于 Go 中的 “协程(Goroutine)”),可以减少编写、维护和调度高吞吐量并发应用程序的工作量。

与本地线程不同,虚拟线程并不有操作系统控制,虚拟线程是一个有JVM管理的用户态线程。对比于本地线程的高资源占用,每个虚拟线程只需要几个字节的内存空间。这是的它更适合控制管理大量的用户访问,或者说处理IO密集型任务。

在创建虚拟线程的数量上几乎没有限制,甚至可以创建一百万个,因为虚拟线程并不需要来自内核的系统调用。

在虚拟线程如此轻量化的条件下,线程池不再成为必须品,只需要在需要的时候尽情创建虚拟线程就好。

虚拟线程和传统的本地线程操作完全兼容,例如本地线程变量,同步块,线程中断,等等。

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

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

相关文章

爬虫程序在采集亚马逊站点数据时如何绕过验证码限制?

引言 在电商数据分析中&#xff0c;爬虫技术的应用日益广泛。通过爬虫技术&#xff0c;我们可以高效地获取大量的电商平台数据&#xff0c;这些数据对于市场分析、竞争情报、价格监控等有着极其重要的意义。亚马逊作为全球最大的电商平台之一&#xff0c;是数据采集的重要目标…

pdf文件损坏打不开怎么修复?文档损坏原因和修复办法分享!

pdf是一种优点很多的软件&#xff0c;它在文件传输过程中格式不会乱掉&#xff0c;而且还可以加密&#xff0c;特别的方便。pdf这种文件格式&#xff0c;不仅能呈现文档&#xff0c;还可以呈现图像&#xff0c;工作中经常会用到。 不过&#xff0c;因为种种原因&#xff0c;有…

【iOS】——Block底层实现和捕获机制

Block的实质 Block的定义是带有自动变量的匿名函数&#xff0c;下面从源码的角度探究下Block究竟是什么 下面是一个Block的简单实现&#xff1a; int main(int argc, const char * argv[]) {autoreleasepool {// insert code here...void (^blk)(void) ^{printf("Bloc…

WordPress原创插件:搜索引擎抓取首图seo图片

WordPress原创插件&#xff1a;搜索引擎抓取首图seo图片 插件设置 插件将在网站头部添加适当的meta标签&#xff0c;以便百度等搜索引擎抓取指定的固定图像。 插件下载 https://download.csdn.net/download/huayula/89596527

Docker容器数据库启动,如何用别名JAR jdbc:postgresql://别名:5432/postgres

如果想了解为啥这样做得同学&#xff0c;请去看这个文章 Docker容器网络&#xff08;七&#xff09;_host.docker.internal-CSDN博客 因为docker0网络&#xff0c;需要用别名的话&#xff0c;还得在host文件加 dockerIp(172.0.0.2) 别名 怎么查&#xff0c; docker network …

C语言:扫雷游戏实现

一、扫雷游戏的分析和设计 扫雷游戏想必大家都玩过吧&#xff0c;初级的玩法是在一个9*9的棋盘上找到没有雷的格子&#xff0c;而今天我们就要做的就是9*9扫雷游戏的实现。 1、游戏功能和规则 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘…

嵌入式学习第11天——C语言选择结构

2024年7月29日 第11天 选择&#xff08;分支&#xff09;结构 分支结构&#xff1a;又被称为选择结构 概念 选择结构&#xff1a;根据条件成立与否&#xff0c;选择相应的操作。 条件构建 关系表达式&#xff1a;含有关系运算符的表达式&#xff08;>,<,>,<,!…

贪心系列专题篇三

目录 单调递增的数字 坏了的计算器 合并区间 无重叠区间 用最少数量的箭 声明&#xff1a;接下来主要使用贪心法来解决问题&#xff01;&#xff01;&#xff01; 单调递增的数字 题目 思路 如果我们遍历整个数组&#xff0c;然后对每个数k从[k,0]依次遍历寻找“单调递…

【计算机毕设论文】基于SpringBoot的诗词管理系统

&#x1f497;博主介绍&#xff1a;✌全平台粉丝5W,高级大厂开发程序员&#x1f603;&#xff0c;博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】小伙伴可以关注我 感兴趣的可以先收藏起来&#xff0c;同学门有不懂的毕设选题&#xff0c;项目以及论文编写等…

一款DC双向马达驱动电路的桥式驱动芯片 - SS6286L

电机驱动芯片 - SS6286L是一款DC双向马达驱动电路&#xff0c;它适用玩具类别的电机驱动、自动阀门电机驱动、电磁门锁驱动等。它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干扰性&#xff0c;微小的待机电流、低的输出内阻&#xff0c;同时&#xf…

Could not install packages due to an EnvironmentError: [WinError 5]

Could not install packages due to an EnvironmentError: [WinError 5] 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城…

通配符https证书的申请途径和配置方法

一、通配符SSL证书的功能 通配符SSL证书&#xff0c;也被称为泛域名证书&#xff0c;是一种特殊类型的SSL证书&#xff0c;它能够保护一个主域名及其所有次级子域名&#xff08;不可跨级保护&#xff09;。例如&#xff0c;如果您的主域名是example.com&#xff0c;那么一个通…

四款2024年不入耳耳机排行榜分享,入耳式耳机戴不舒服的可入手

随着长时间的入耳式耳机佩戴&#xff0c;很多人都发现其实入耳式耳机逐步成为了引起耳朵感染疾病的原因之一。因为经常佩戴入耳式耳机会导致耳道湿度高、微生物更容易生长&#xff0c;进而耳道分泌物也更多了&#xff0c;所以其实现在流行的不入耳耳机&#xff0c;也就是开放式…

昇思25天学习打卡营第1天|快速入门实操教程

昇思25天学习打卡营第1天|快速入门实操教程 目录 昇思25天学习打卡营第1天|快速入门实操教程 一、MindSpore内容简介 主要特点&#xff1a; MindSpore的组成部分&#xff1a; 二、入门实操步骤 1. 安装必要的依赖包 2. 下载并处理数据集 3. 构建网络模型 4. 训练模型…

vue项目中 watch监听的用法

1.导航栏有个搜索功能&#xff0c;点击搜索是路由跳转到课程列表这个页面&#xff0c; 2. 搜索关键字课程&#xff0c;路由跳转到openClass页面&#xff0c;并且携带query参数 search <div class"inputStyle" style"width: 280px;"><el-input v…

Tsucs吸引子:动态系统的神秘引力——从状态方程到稳定解的追寻

Tsucs吸引子&#xff1a;动态系统的神秘引力——从状态方程到稳定解的追寻 Tsucs吸引子的直观类比 你可以把Tsucs吸引子想象成一个神秘的“黑洞”&#xff0c;它不断地“吸引”着动态系统中的各种状态&#xff0c;使它们最终都落入一个稳定的“中心点”&#xff0c;就像黑洞吞噬…

c程序杂谈系列(职责链模式与if_else)

从处理器的角度来说&#xff0c;条件分支会导致指令流水线的中断&#xff0c;所以控制语句需要严格保存状态&#xff0c;因为处理器是很难直接进行逻辑判断的&#xff0c;有可能它会执行一段时间&#xff0c;发现出错后再返回&#xff0c;也有可能通过延时等手段完成控制流的正…

【C++/STL】:哈希 -- 线性探测哈希桶

目录 &#x1f4a1;前言一&#xff0c;unordered系列容器二&#xff0c;哈希2.1 哈希的概念2.2 哈希函数2.3 哈希冲突 三&#xff0c;哈希冲突解决(重点)3.1 开放定址法3.2 哈希桶(重点) 四&#xff0c;线性探测的实现4.1 线性探测的基本框架4.2 插入操作4.3 查找操作4.4 删除操…

Let‘s Encrypt

启动Https,需要从证书授权机构(简称CA)处获取一个证书,Lets Encrypt就是一个CA Lets Encrypt上可以获得免费的ssl证书,时间是3个越 下面通过Nginx和Lets Encrypt让网站升级到HTTPS Certbot简介 Certbot是Lets Encrypt官方推荐的获取证书的客户端 Centos 7.9操作 yum install …

openai版本不适配问题(在windows系统下openai migrate)

问题如下&#xff1a; 方法&#xff1a; 参考官网v1.0.0 Migration Guide openai/openai-python Discussion #742 GitHub 具体步骤&#xff1a; 1、curl -fsSL https://docs.grit.io/install | bash -x 但该命令可能不好用————将‘curl -fsSL https://docs.grit.io/i…