虛擬線程(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。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源