首頁  >  文章  >  Java  >  Java 虛擬執行緒:徹底改變並發性!

Java 虛擬執行緒:徹底改變並發性!

Susan Sarandon
Susan Sarandon原創
2024-11-03 12:35:301001瀏覽

Java 21 引入了遊戲規則改變者虛擬執行緒!讓我們來分析一下這個功能是什麼,它與傳統模型有何不同,以及它的優缺點。

什麼是虛擬線程?

Java Virtual Threads: Revolutionizing Concurrency!
在先前的 Java 版本中,建立線程意味著將其直接綁定到作業系統 (OS) 線程,這是一種有限的資源。啟動大量作業系統執行緒通常會導致效能瓶頸並增加記憶體使用量。在 Java 21 中,虛擬執行緒(又稱 Project Loom)旨在透過提供與作業系統執行緒解耦的輕量級、可管理的執行緒來解決這個問題。

?簡而言之:將虛擬線程視為微型線程,可以讓您更有效地處理數千個並發任務,而不會佔用系統資源。


舊線程模型與虛擬線程

Java Virtual Threads: Revolutionizing Concurrency!
Java 的舊線程模型是基於“平台線程”,要求每個 Java 線程與作業系統線程有 1:1 的映射。雖然可靠,但它也意味著:

記憶體限制:平台執行緒佔用大量記憶體。
擴充問題:管理大量執行緒可能會使系統資源過載。
阻塞 I/O 問題: 等待 I/O 的作業系統執行緒阻塞其他操作,從而降低效能。

進入虛擬線程! ?‍♂️
虛擬線程允許您創建數百萬個線程,而不會造成資源緊張。它們不會綁定到作業系統線程,因此當虛擬線程被阻塞(例如,等待 I/O)時,底層承載線程可以拾取另一個虛擬線程以保持事物順利運行。


傳統線程與虛擬線程

Java Virtual Threads: Revolutionizing Concurrency!

TRADITIONAL THREADS                        VIRTUAL THREADS
---------------------------------          ---------------------------------
| Java Thread -> OS Thread -> Task |       | Virtual Thread -> Carrier OS Thread |
| Java Thread -> OS Thread -> Task |  ->   | Virtual Thread -> Carrier OS Thread |
| Java Thread -> OS Thread -> Task |       | Virtual Thread -> Carrier OS Thread |
---------------------------------          ---------------------------------


在虛擬線程中,可以將多個虛擬線程分配給一個作業系統線程,從而優化資源分配。

虛擬線程的優點和缺點

優點

更高的可擴展性:處理數百萬個線程,使其非常適合伺服器端應用程式。
更少的記憶體使用:虛擬執行緒是輕量級的,這意味著每個執行緒不需要完整的作業系統執行緒。
高效率的阻塞I/O:當虛擬執行緒遇到阻塞I/O時,承載執行緒可以接手其他任務,保持系統活躍。
更好的資源管理:執行緒不再侷限於有限的作業系統執行緒池,因此浪費的資源較少。

缺點

學習曲線:虛擬執行緒引入了新的並發概念,這可能需要重新思考現有的執行緒管理實踐。
新的調試挑戰: 調試數千(甚至數百萬)個虛擬線程可能會更加複雜。
並非所有應用程式的理想選擇:單執行緒應用程式或並發量最小的應用程式不會從虛擬執行緒中受益太多。


程式碼範例:傳統線程與虛擬線程

讓我們來看一個傳統執行緒的簡單範例,並將其與虛擬執行緒進行比較。

傳統執行緒

TRADITIONAL THREADS                        VIRTUAL THREADS
---------------------------------          ---------------------------------
| Java Thread -> OS Thread -> Task |       | Virtual Thread -> Carrier OS Thread |
| Java Thread -> OS Thread -> Task |  ->   | Virtual Thread -> Carrier OS Thread |
| Java Thread -> OS Thread -> Task |       | Virtual Thread -> Carrier OS Thread |
---------------------------------          ---------------------------------

虛擬執行緒 (Java 21)

虛擬執行緒由 Java 虛擬機器 (JVM) 獨立管理,且不限於作業系統執行緒。

public class TraditionalThreadExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> System.out.println("Hello from a traditional thread!"));
        thread.start();
    }
}

使用平台和虛擬執行緒運行 100000 個任務的範例。

public class VirtualThreadExample {
    public static void main(String[] args) {
        Thread.startVirtualThread(() -> System.out.println("Hello from a virtual thread!"));
    }
}


什麼時候應該使用虛擬線程?

  • 伺服器應用程式:處理多個並發請求,例如 Web 伺服器或資料庫連線。
  • I/O 密集型應用程式:這些特別是需要大量 I/O 操作的應用程序,例如文件處理、網頁請求或網頁抓取。
  • 雲端原生微服務:需要高可擴展性的系統將受益於虛擬執行緒。

結論:並發的未來就在這裡?

隨著 Java 21 中虛擬執行緒的引入,管理並發任務比以往更有效率、可擴展且輕量。無論您要處理數百個還是數百萬個任務,虛擬執行緒都提供了一種更簡單、更資源友善的 Java 程式設計方式。

以上是Java 虛擬執行緒:徹底改變並發性!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn