如何控制java虚拟线程的并发度?

news/2024/12/26 13:34:51/文章来源:https://www.cnblogs.com/yjmyzz/p/18553598

jdk 21中的虚拟线程已经推出好一段时间了,确实很轻量,先来一段示例:

假如有一段提交订单的业务代码:

1     public void submitOrder(Integer orderId) {
2         sleep(1000);
3         System.out.println("order:" + orderId + " is submitted");
4     }
View Code

这里我们用sleep来模拟,每提交1个订单,大致耗时1秒。

如果有10个订单一起下单,顺序执行的话,至少10秒,很容易想到用多线程:

 1     @Test
 2     public void submitOrder1() {
 3         ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("submitOrder-pool-%d").build();
 4         ExecutorService submitOrderPool = new ThreadPoolExecutor(4, 16, 300L, TimeUnit.SECONDS,
 5                 new LinkedBlockingQueue<>(128), threadFactory, new ThreadPoolExecutor.DiscardOldestPolicy());
 6         CompletableFuture<Void>[] futures = new CompletableFuture[10];
 7         StopWatch watch = new StopWatch();
 8         watch.start();
 9         //下10个订单
10         for (int i = 0; i < 10; i++) {
11             final int orderId = i;
12             CompletableFuture<Void> future = CompletableFuture.runAsync(() -> submitOrder(orderId), submitOrderPool);
13             futures[i] = future;
14         }
15         CompletableFuture.allOf(futures).join();
16         watch.stop();
17         System.out.println("Time: " + watch.getTime());
18     }
View Code

这里我们使用了传统的线程池,核心线程数是4,小于10,所以会内部排队,最终执行效果大致如下:

order:0 is submitted
order:3 is submitted
order:1 is submitted
order:2 is submitted
order:4 is submitted
order:6 is submitted
order:7 is submitted
order:5 is submitted
order:8 is submitted
order:9 is submitted
Time: 3035
View Code

明显快多了,但是占用了4个传统的java线程。

 

我们改用虚拟线程来改写:

 1     @Test
 2     public void submitOrder2() {
 3         CompletableFuture<Void>[] futures = new CompletableFuture[10];
 4         StopWatch watch = new StopWatch();
 5         watch.start();
 6         //下10个订单(这里使用虚拟线程)
 7         try (ExecutorService service = Executors.newVirtualThreadPerTaskExecutor()) {
 8             for (int i = 0; i < 10; i++) {
 9                 final int orderId = i;
10                 CompletableFuture<Void> future = CompletableFuture.runAsync(() -> submitOrder(orderId), service);
11                 futures[i] = future;
12             }
13             CompletableFuture.allOf(futures).join();
14         }
15         watch.stop();
16         System.out.println("Time: " + watch.getTime());
17     }
View Code

 

参考文档:
https://blog.moyucoding.com/jvm/2023/09/23/ultimate-guide-to-java-virtual-thread

https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html#GUID-DC4306FC-D6C1-4BCC-AECE-48C32C1A8DAA

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

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

相关文章

保险行业客户服务优化:客户运营知识库的实战应用

在保险行业,客户服务优化是提升客户满意度、增强企业竞争力的关键。客户运营知识库作为客户服务的重要支撑,其实战应用对于提升客户服务质量具有重要意义。本文将探讨保险行业客户服务优化的重要性、客户运营知识库的实战应用以及如何利用“HelpLook”工具实现客户服务优化。…

2024-11-18纯碱行情的解浪

图中蓝色线为调整浪ABC线 黄色线为5浪线 纯碱现在走的是ABC-C---->C-5---------5-4 总体来说是大级别的C浪,C浪的5浪,5浪的4浪回调,由于5浪的子2浪是都直的简单调整,5浪的一浪是启动三角形,趋势非常丝滑。这个5浪的子4浪会是大概率 的ABC调整,现在在走B浪还未完成,还…

2024-11-18 PVC分析

5182将是相当长时间的历史大底,这波不会破新低,以后N年也大概率不会破了。多头网格的好品种

ESP32蓝牙学习--蓝牙概念学习

前言 ESP32 是一款同时包含WIFI 蓝牙两者通信方式的芯片,之前学习过WIFI,这次学习一下其蓝牙功能,虽然之前有使用过其他的蓝牙芯片,但大多数都是使用应用层,很少去了解底层协议相关的知识,这一次从概念入手,细致了解一下蓝牙的相关概念,及ESP32相关的工程说明。 蓝牙的…

网络配置及进程-系统性能和计划任务

目录虚拟机联网 shell脚本实例 索引数组和关联数组,字符串处理,高级变量 进程管理 计划任务虚拟机联网 查看IP地址 #centos系列![root@localhost ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.93.200 netmask 255.255.255.…

2024-11-18 大盘分析

牛市已经开始 首先上证季线级别4浪已经完美完成 本次上涨预计最高点位突破11000点再看商品市场 季线级别的3浪已经走完了前4浪,3-5已经启动,3浪的5浪 5of3 与3of3同样的强.3浪的上涨空间是100多一些,5浪可能 会更长。

【Project 2024软件下载与安装教程-亲测好用】

‌Project 2024的操作系统要求是Windows 10及以上版本‌。这意味着用户需要在Windows 10或更高版本的操作系统上安装和使用Project 2024‌1。 Project 2024是由Microsoft开发的一款高效实用的项目管理工具,旨在帮助项目经理发展计划、为任务分配资源、跟踪进度、管理预算和分析…

20222420 2024-2025-1 《网络与系统攻防技术》实验六实验报告

20222420 2024-2025-1 《网络与系统攻防技术》实验六实验报告 1.实验内容 (1)前期渗透①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等 ③选做:也可以扫系统版本、漏洞等。(2)Vsftpd源码包后门漏洞(…

Wincc 7.5SP2下VBA编程批量设置变量线性标定

继续学习wincc下面VBA编程,这个练习实现变量线性标定。 在前面练习基础上做,有REAL1至REAL10共10个变量,通过VBA脚本对Real1至Real5设置线性标定。 写下面的VBA脚本: Sub SetTagScaleParameter()Dim hmigo As hmigoDim strTagName As StringDim i As IntegerSet hmigo = N…

20222422 2024-2025-1 《网络与系统攻防技术》实验六实验报告

一、实验内容 本实践目标是掌握metasploit的用法。指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 用户名密码均为:msfadmin(1)前期渗透 ①主机发现(可用…

测试工程师的苦水与解药:别让这些问题毁了你的职业生涯!

咱这些测试工程师啊,外人瞅着好像工作挺简单,不就是找找软件的毛病嘛。可实际上,这里面的苦啊,就像那一团乱麻,扯都扯不清,全是无奈和心酸。 加班加到“怀疑人生” 咱这加班啊,那可真是没个头。经常整到深更半夜,感觉自己都快不是个人了,身体那是越来越差,就像个破机…