首页 > 编程语言 >Java 21 虚拟线程如何限流控制吞吐量

Java 21 虚拟线程如何限流控制吞吐量

时间:2024-02-20 17:33:49浏览次数:30  
标签:Java 21 并发 虚拟 线程 Semaphore 限流

虚拟线程(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新特性

扩展阅读

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

标签:Java,21,并发,虚拟,线程,Semaphore,限流
From: https://www.cnblogs.com/didispace/p/18023642

相关文章

  • Caused by: java.lang.ClassNotFoundException: com.qcloud.cos.auth. 类找不到异常
    java.lang.ClassNotFoundException 表示在运行时找不到指定的类。在这种情况下,缺少了 com.qcloud.cos.auth 包中的类。请确保项目中包含了腾讯云 COS SDK 相关的依赖,并且这些依赖能够正确加载。检查项目的依赖配置,确保包含了腾讯云 COS SDK 相关的依赖。 腾讯云contr......
  • Java类加载机制和执行顺序
    下面代码运行结果为——点击查看代码packagecom.itcq.d5;publicclassApp{publicstaticvoidmain(String[]args){newB();}}classA{static{System.out.println("Static-A执行了~~~");}{System.out.printl......
  • 【Java】java线程的六种状态
          一、新建状态(NEW)即用new关键字新建一个线程,这个线程就处于新建状态。二、运行状态(RUNNABLE)操作系统中的就绪和运行两种状态,在Java中统称为RUNNABLE。 就绪状态(READY)当线程对象调用了start()方法之后,线程处于就绪状态,就绪意味着该线程......
  • 使用Java将视频中某一帧抽取为封面图片
    由于业务需求需将视频中的某帧进行截取作为该视频封面,网上太多教程过于复杂麻烦,经本人研究发现可以使用Java调用FFmpeg来进行处理。/***获取指定的视频文件后进行封面截图为png并保存到指定目录**@paramvideoFile视频媒体文件*@paramfileName文件名*/publicS......
  • native-lib-loader java native 库的java 包
    native-lib-loader可以方便native库的查找,只要我们的c库符合格式,基于native-lib-loader就可以方便的进行包的加载参考c库jar格式/natives/linux_32libxxx[-vvv].so/linux_64libxxx[-vvv].so/osx_32libxxx[-vvv].dylib......
  • C#和Java Model的区别
    下面是一个简单的患者类示例,分别使用C#和Java实现,包含患者ID和姓名属性:C#示例:publicclassPatient{//患者ID属性publicintPatientId{get;set;}//姓名属性publicstringName{get;set;}//构造函数publicPatient(intpa......
  • 手动将一个java程序打包成jar包
    1.目录结构新建三个目录:bin,META-INF,src src目录下存放源码 META-INF目录下存放MANIFEST.MF bin目录下存放.class文件 2.编译源码javac-dbinsrc/DESUtil.java 3.在META-INF目录下新建MANIFEST.MF文件Manifest-Version:1.0Main-Class:DESUtilClass-......
  • Java实现静态链表
    本文参照了大话数据结构的静态链表的c语言实现packagecom.luoyi.list;/***@Description静态链表*@AuthorLuoyi*@Date2024/2/19**注:1.索引为0的节点不存放数据,cur指向第一个空闲节点的下标*2.最后一个元素(即下标Maxsize-1)的cur指向第一个有效数......
  • 「Java开发指南」MyEclipse如何支持Spring Scaffolding?(三)
    在上文中主要为大家介绍了CRUDScaffolding,本文将继续介绍应用程序的分层、代码助手等。MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论3.应用程序的分层应用程序分层是应用程序开发领域中非常常见的体系结构方法,应用程序分层包括将应用程序代......
  • Java SE 完结心得
    昨天刚看完JavaSE的最后一节课,Java基础阶段将近花费了35天的时间,这个时间相对来说是比较长的。整个阶段学习状态也是断断续续的,没有每天按时的学习,经常是今天学完,明天不学了。下面开始学习Javaweb的时候,要及时的调整自己的状态。不能每天在满不在乎的了。基础阶段跟的是黑马......