3 分鐘理解 Java 虛擬執行緒

張哥說技術發表於2023-12-27

來源:waynblog

虛擬執行緒是 Java 語言中實現的一種輕量級執行緒,在 Java 專案中可以減少編寫、維護和除錯高吞吐量併發應用程式的工作量。

有關虛擬執行緒的背景介紹,大家可以參閱 JEP 444。

在作業系統中,執行緒是其可排程的最小處理單元。同一時刻會有很多執行緒同時執行,但它們之間基本相互獨立執行。

在 Java 中,操作執行緒的相關 API 都在 java.lang.Thread 類中。在 Java 21 以後,執行緒有兩種,一種是平臺執行緒,一種是虛擬執行緒。

本文大綱,

3 分鐘理解 Java 虛擬執行緒

什麼是平臺執行緒?

平臺執行緒被實現為作業系統執行緒的簡單包裝器。平臺執行緒上執行的 Java 程式碼,在其底層邏輯上,其實就是執行在作業系統的執行緒上,並且平臺執行緒在其整個生命週期內都與作業系統執行緒一一對應。

3 分鐘理解 Java 虛擬執行緒

因此在 Java 專案中,可用平臺執行緒的數量依賴於作業系統執行緒的數量。根據作業系統和 JVM 啟動引數配置的不同,建立一個平臺執行緒預設會消耗 1 MB 的空間。

因此平臺執行緒的資源相當寶貴,我們無法大量的建立平臺執行緒。

在 Java 21 虛擬執行緒出來以前,可能大家都沒聽說過平臺執行緒,那麼到底什麼是平臺執行緒嘞?這裡我給大家一句話解釋清楚。

在 Java 21 虛擬執行緒出來以前,Java 所提供的執行緒都是平臺執行緒,一個執行緒對應一個作業系統執行緒,並且平臺執行緒很珍貴,不能大量建立。(大家為了節約執行緒資源,也就有了執行緒池的概念)

什麼是虛擬執行緒?

與平臺執行緒一樣,虛擬執行緒也是 java.lang.Thread 的一個例項物件。但是,虛擬執行緒並不依賴於特定的作業系統執行緒。

虛擬執行緒底層仍然在作業系統的執行緒上執行程式碼。但是與平臺執行緒不相同的是,在平臺執行緒中執行的程式碼呼叫阻塞 I/O 操作時,JVM 就會掛起該平臺執行緒(也就會掛起作業系統執行緒),直到阻塞 I/O 可以恢復為止。

而在虛擬執行緒中呼叫阻塞 I/O 操作時,JVM 雖然也會掛起該虛擬執行緒,但是與平臺執行緒不同的是,被掛起虛擬執行緒關聯的作業系統執行緒是可以為其他虛擬執行緒繼續服務的。

3 分鐘理解 Java 虛擬執行緒

虛擬執行緒的實現方式與虛擬記憶體類似。為了模擬大量記憶體,作業系統將較大的虛擬地址空間對映到有限的 RAM。同樣,為了模擬大量執行緒,Java 執行時將大量虛擬執行緒對映到少量作業系統執行緒。

因此與平臺執行緒消耗的資源很多不同,虛擬執行緒在使用時只需要很少的記憶體資源。單個 JVM 就可以輕鬆建立數百萬個虛擬執行緒。

使用虛擬執行緒是,通常建議呼叫堆疊不要過深,只執行單個 HTTP 客戶端呼叫或單個 JDBC 查詢即可。儘管虛擬執行緒支援執行緒區域性變數和可繼承的執行緒區域性變數,但我們應該仔細考慮後再使用它們,因為單個 JVM 可能執行數百萬個虛擬執行緒。

虛擬執行緒適合用於執行有大量阻塞 I/O 操作的任務,而不是長時間執行的 CPU 密集型任務。

為什麼建議使用虛擬執行緒?

在高吞吐量、高併發應用程式中推薦使用虛擬執行緒,尤其是那些包含大量併發任務且大部分時間都在等待阻塞 I/O 操作的應用程式中。

使用虛擬執行緒可以讓應用程式就算使用同步阻塞 API,也能對作業系統的硬體資源利用達到近乎完美水平。

可以說,虛擬執行緒的引入,以後程式設計師就算是使用 Java 中同步阻塞 API 也可以開發出高效能、高吞吐量的應用程式。


最後總結一下,虛擬執行緒是一種輕量級執行緒,帶給了程式設計師一種新的程式設計體驗。

編寫高效能、高吞吐量應用程式時使用虛擬執行緒配合同步阻塞 API 就能得到與非同步程式設計模型相媲美的效能,並且避免了非同步程式設計模型的程式設計複雜度。比如在 Spring Boot3.2 中,Tomcat 就可以透過啟用虛擬執行緒帶來可觀的效能提升。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024923/viewspace-3001753/,如需轉載,請註明出處,否則將追究法律責任。

相關文章