虚拟线程(Virtual Threads)是 Java 21

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

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

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

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

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

虚拟线程的限流

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

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

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

散热风扇https://www.uv-semi.com/

深圳网站建设www.sz886.com

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容