2

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

 7 months ago
source link: https://www.didispace.com/java-features/java21/jep444-virtual-threads-rate-limiting.html#%E6%89%A9%E5%B1%95%E9%98%85%E8%AF%BB
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

程序猿DD原创2024年2月20日JavaJavaJava 21虚拟线程大约 2 分钟

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

# 扩展阅读


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK