虚构线程(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。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源