在Java 21中,引入了虛擬線程(Virtual Threads)來簡化和增強併發性,這使得在Java中編程併發程式更容易、更高效。 虛擬線程,也稱為“用戶模式線程(user-mode threads)”或“纖程(fibers)”。該功能旨在簡化併發編程並提供更好的可擴展性。虛擬線程是輕量級的,這 ...
在Java 21中,引入了虛擬線程(Virtual Threads)來簡化和增強併發性,這使得在Java中編程併發程式更容易、更高效。
虛擬線程,也稱為“用戶模式線程(user-mode threads)”或“纖程(fibers)”。該功能旨在簡化併發編程並提供更好的可擴展性。虛擬線程是輕量級的,這意味著它們可以比傳統線程創建更多數量,並且開銷要少得多。這使得在自己的線程中運行單獨任務或請求變得更加實用,即使在高吞吐量的程式中也是如此。
創建和使用虛擬線程
在Java 21中創建和使用虛擬線程有多種方法:
1. 使用靜態構建器方法
Thread.startVirtualThread
方法將可運行對象作為參數來創建,並立即啟動虛擬線程,具體如下代碼:
Runnable runnable = () -> {
System.out.println("Hello, www.didispace.com");
};
// 使用靜態構建器方法
Thread virtualThread = Thread.startVirtualThread(runnable);
也可以使用Thread.ofVirtual()
來創建,這裡還可以設置一些屬性,比如:線程名稱。具體如下代碼:
Thread.ofVirtual()
.name("didispace-virtual-thread")
.start(runnable);
2. 與ExecutorService
結合使用
從Java 5開始,就推薦開發人員使用ExecutorServices
而不是直接使用Thread
類了。現在,Java 21中引入了使用虛擬線程,所以也有了新的ExecutorService
來適配,看看下麵的例子:
Runnable runnable = () -> {
System.out.println("Hello, www.didispace.com");
};
try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 100; i++) {
executorService.submit(runnable);
}
}
上述代碼在try代碼塊中創建了一個ExecutorServices
,用來為每個提交的任務創建虛擬線程。
3. 使用虛擬線程工廠
開發者還可以創建一個生成虛擬線程的工廠來管理,具體看下麵的例子例子:
Runnable runnable = () -> {
System.out.println("Hello, www.didispace.com");
};
ThreadFactory virtualThreadFactory = Thread.ofVirtual()
.name("didispace", 0)
.factory();
Thread factoryThread = virtualThreadFactory.newThread(runnable);
factoryThread.start;
這段代碼創建了一個虛擬線程工廠,每個虛擬線程都會以didispace
為首碼、以數字結尾(從0開始累加)的名稱。
小結
上面我們介紹了虛擬線程的創建和使用,而我們大多數Java開發者都基於Spring來開發具體業務應用,所以很多場景下可能都不太涉及手工創建的操作。所以,對於虛擬線程的概念,你只需要有一個基本的認識。所以,在文章的最後,做一個小結,以方便大家理解和記憶:
- 虛擬線程是由JVM管理的輕量級線程。
- 虛擬線程不需要任何顯式分配或調度。
- 虛擬線程非常適合I/O密集型任務或需要大量並行性的任務。
- 虛擬線程也可以用來實現非同步操作。
另外,值得註意的是,雖然虛擬線程可以在併發性和可擴展性方面提供顯著的幫助,但它們並不總是適合所有場景。有些需要大量計算的任務,並不一定在虛擬線程中運行更好,因為虛擬線程也有上下文切換的開。具體情況還是需要通過測試評測,以找到最優解。
如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!另外,不要走開,關註我!持續更新Java新特性專欄!
參考資料
歡迎關註我的公眾號:程式猿DD。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源