乐趣区

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

退出移动版