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