码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java 21 虚拟线程如何限流控制吞吐量


    虚拟线程(Virtual Threads)是 Java 21 所有新特性中最为吸引人的内容,它可以大大来简化和增强Java应用的并发性。但是,随着这些变化而来的是如何最好地管理此吞吐量的问题。本文,就让我们看一下开发人员在使用虚拟线程时,应该如何管理吞吐量。

    在大多数情况下,开发人员不需要自己创建虚拟线程。例如,对于 Web 应用程序,Tomcat 或 Jetty 等底层框架将为每个传入请求自动生成一个虚拟线程。

    如果在应用程序内部需要自行调用来提供业务并发能力时,我们可以使用Java 21新特性:虚拟线程(Virtual Threads)中介绍的方法去创建和使用,比如较为常用的就是Executors.newVirtualThreadPerTaskExecutor()。

    Runnable runnable = () -> {
        System.out.println("Hello, www.didispace.com");
    };
    
    try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
        for (int i = 0; i < 100; i++) {
            executorService.submit(runnable);
        }
    }
    

    我们可以像上面开启100个虚拟线程来执行任务。那么问题来了,我们要如何对虚拟线程限流控制吞吐量呢?

    虚拟线程的限流

    对于虚拟线程并发控制的答案是:信号量!划重点:不要池化虚拟线程,因为它们不是稀缺资源。所以,对于虚拟线程并发控制的最佳方案是使用java.util.concurrent.Semaphore。

    下面的代码示例演示了如何实现java.util.concurrent.Semaphore来控制虚拟线程的并发数量:

    public class SemaphoreExample {
    
        // 定义限流并发的信号量,这里设置为:10
    	private static final Semaphore POOL = new Semaphore(10); 
    
    	public void callOldService(...) {
    		try{
    			POOL.acquire(); // 尝试通过信号量获取执行许可
    		} catch(InterruptedException e){
                // 执行许可获取失败的异常处理		
    		}
    	
    		try {
    			// 获取到执行许可,这里是使用虚拟线程执行任务的逻辑
    		} finally {
                // 释放信号量
    			POOL.release(); 
    		}
    	}
    }
    

    是不是很简单呢?今天的分享就到这里,希望对你有所帮助,更多关于Java新特性的学习可以关注我的免费专栏Java新特性。

    扩展阅读

    • 启动1000万个虚拟线程需要多少时间?需要多少平台线程?
    • Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较

    欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

  • 相关阅读:
    长春理工大学计算机考研资料汇总
    【毕业设计】机器视觉的图像拼接算法研究与实现 - python 深度学习
    计算机图形学入门13:纹理映射常见问题、MipMap
    公考求的是稳定,搞IT求的是高薪,鱼和熊掌能否兼得?
    Ops实践 | 云原生Prometheus监控之企业网站指标采集预警及可视化大盘展示
    Request方法的使用、JSON文件介绍、Python中的JSON数据以及获取到的JSON数据的解析。
    认知无线电网络的服务质量——蜻蜓算法的应用(Matlab代码实现)
    Lombok中的@Builder注解的使用
    Tomcat的下载安装与配置
    NTP8928(20W内置DSP双通道D类功放芯片)
  • 原文地址:https://www.cnblogs.com/didispace/p/18023642
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号