Java 21 新特性:虛擬執行緒(Virtual Threads)

程式猿DD發表於2023-09-28

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

相關文章