目錄
什麼是虛擬線程?
為什麼虛擬線程提高並發性
在引擎蓋下的項目織機如何工作
實際示例:高電流HTTP服務器
何時使用虛擬線程
遷移現有代碼
最後的想法
首頁 Java java教程 在Java中使用Project Loom進行輕量級並發

在Java中使用Project Loom進行輕量級並發

Jul 26, 2025 am 06:41 AM
java 並行

Project Loom引入了虛擬線程,以通過實現輕質,可擴展的線程來解決Java的並發限制。 1。虛擬線程是由JVM管理的低英尺螺紋線程,可允許數百萬的並發線程具有最小的OS資源。 2。他們通過允許每個請求的一個線程而沒有復雜的異步代碼來簡化高頻率編程。 3。諸如I/O之類的阻塞操作懸掛虛擬線程而無需阻止OS線程,從而改善吞吐量。 4。現有代碼可以通過用執行者替換傳統的線程池來採用虛擬線程。 newVirtualThreadPertAsKexeCutor()。 5。虛擬線程非常適合諸如Web服務器之類的I/O結合任務,而不是CPU密集型工作。 6。不需要重大的代碼更改,以確保向後兼容。從Java 21開始,虛擬線程已經準備就緒,在維護熟悉的阻塞式代碼的同時,為反應性模型提供了更簡單,可擴展的替代方案。

在Java中使用Project Loom進行輕量級並發

Java的傳統線程模型基於Java線程和OS線程之間的一對一映射,長期以來一直是構建高度並發應用的瓶頸。每個線程都會消耗大量的內存和操作系統資源,使創建數百萬個線程變得不切實際。 Project Loom旨在通過通過虛擬線程引入輕量級並發來解決這一問題,這是Java處理並發方式的重大轉變。

在Java中使用Project Loom進行輕量級並發

目標?使編寫簡單,可擴展和高通量並發應用程序易於編寫,而無需訴諸複雜的反應性或異步編程模型。


什麼是虛擬線程?

虛擬線程是由JVM而不是操作系統管理的輕質線程。與平台線程(傳統的java.lang.Thread )不同,成千上萬甚至數百萬個虛擬線程可以在少數基礎操作系統線程上有效運行。

在Java中使用Project Loom進行輕量級並發

關鍵特徵:

  • 由JVM創建和計劃,而不是OS
  • 低內存足跡- 每個虛擬線程使用的堆棧空間要少得多
  • 無需池- 與平台線程不同,您不需要線程池,例如ThreadPoolExecutor
  • 置換式替換- 他們仍然實現java.lang.Thread ,因此大多數現有代碼都沒有變化

例子:

在Java中使用Project Loom進行輕量級並發
線程VirtualThread = thread.ofvirtual()
    .NAME(“ VT-”)
    .unstarted(() - > {
        system.out.println(“在虛擬線程上運行:” thread.currentThread());
    });

virtualThread.start();
virtualThread.join();

這看起來像常規的線程代碼 - 但現在可以輕巧且可擴展。


為什麼虛擬線程提高並發性

傳統的服務器應用程序通常使用每次重新要求的型號。在高負載下,這導致:

  • 線耗盡
  • 高上下文開關開銷
  • 複雜的異步代碼(例如,完整的未圖,反應流)

虛擬線程通過以下方式消除了這些問題

  • 允許大規模並發- 每個請求安全產生一個線程
  • 簡化代碼結構- 繼續使用阻止I/O和直接邏輯
  • 改善吞吐量- 特別是對於I/O結合任務(例如,HTTP調用,數據庫查詢)

例如,使用虛擬線程,Web服務器只能使用只有幾十個OS線程處理10,000個並發請求 - EAPE請求在其自己的虛擬線程上運行。


在引擎蓋下的項目織機如何工作

Project Loom介紹了三個關鍵組成部分:

  1. 虛擬線程
    在載波線程(OS/Platform螺紋)頂部運行的輕質線程。

  2. 載體線
    執行虛擬線程的實際操作系統。默認情況下由forkjoinpool管理。

  3. 連續(實驗)
    允許暫停和恢復代碼執行的低級構造。尚未公開API,但可以為未來的異步模式提供動力。

當虛擬螺紋塊(例如,在I/O上)時,織機將其懸掛而不是阻止載體線程。然後,載體可以自由運行另一個虛擬線程。 I/O完成後,將在任何可用的載體上恢復虛擬線程。

這對開發人員來說是透明的 - 您的Thread.sleep()socket.read()


實際示例:高電流HTTP服務器

使用Java內置的ExecutorServiceHttpServer使用虛擬線程:

嘗試(var server = httpserver.create(new InetSocketAddress(8080),0)){
    server.createcontext(“/task”,Exchange-> {
        嘗試 {
            //模擬阻止工作(例如,DB調用)
            thread.sleep(1000);
            字符串響應=“ hello from” thread.currentthread();
            Exchange.SendResponseHeaders(200,wendment.length());
            Exchange.getResponseBody()。寫(wendys.getBytes());
        } 最後 {
            Exchange.Close();
        }
    });

    //使用虛擬線程處理請求
    var executor = executors.newvirtualThreadPertasKexecutor();
    server.setexecutor(executor);
    server.start();

    system.out.println(“在端口8080上運行的服務器”);
    thread.sleep(60_000); //跑1分鐘
}

現在,即使有10,000個並發客戶端提出請求,服務器也會使用最小的操作系統線程響應。


何時使用虛擬線程

最適合:

  • I/O結合任務(Web服務器,微服務,DB訪問)
  • 具有高並發性和低CPU使用情況的申請
  • 簡化遺產阻止代碼

不理想:

  • CPU密集型工作(它們不會改善原始計算性能)
  • 替換線池以進行並行計算(使用ForkJoinPoolparallelStream粘貼)

另外,避免過度同步(例如, synchronized塊),因為它們可以阻止載波線並降低可伸縮性。


遷移現有代碼

項目織機的最大勝利之一是向後兼容。您無需重寫代碼。

採用虛擬線程:

  • Executors.newFixedThreadPool()替換Executors.newVirtualThreadPerTaskExecutor()
  • 避免匯總虛擬線程(它們便宜地創建)
  • 使用結構化並發(Java 19中的新)進行更好的生命週期管理

示例遷移:

 //舊:平台線程池有限
// executorService executor = executors.newfixedThreadPool(10);

//新:無界虛擬線程
executorService executor = executors.newvirtualThreadPertasKexeCutor();

現在,每個任務都在虛擬線程上運行 - 簡單且可擴展。


最後的想法

Project Loom不會替代反應性編程,但它提供了令人信服的替代方法:編寫簡單,可讀,阻塞風格的代碼,以縮放諸如異步

使用虛擬線程,Java朝著未來不再是複雜性代名詞的未來。無論您是構建微服務,批處理處理器還是API,織機都可以更輕鬆地編寫高效,可維護的代碼。

最好的部分?您今天可以開始使用它 - 截至Java 21起已經準備好生產。

基本上:如果您要處理I/O和並發,請嘗試虛擬線程。性能和簡單增長是真實的。

以上是在Java中使用Project Loom進行輕量級並發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

Rimworld Odyssey溫度指南和Gravtech
1 個月前 By Jack chen
初學者的Rimworld指南:奧德賽
1 個月前 By Jack chen
PHP變量範圍解釋了
4 週前 By 百草
撰寫PHP評論的提示
3 週前 By 百草
在PHP中評論代碼
3 週前 By 百草

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1604
29
PHP教程
1509
276
Edge PDF查看器不起作用 Edge PDF查看器不起作用 Aug 07, 2025 pm 04:36 PM

testthepdfinanotherapptoderineiftheissueiswiththefileoredge.2.enablethebuilt inpdfviewerbyTurningOff“ eflblyopenpenpenpenpenpdffilesexternally”和“ downloadpdffiles” inedgesettings.3.clearbrowsingdatainclorwearbrowsingdataincludingcookiesandcachedcachedfileresteroresoreloresorelorsolesoresolesoresolvereresoreorsolvereresoreolversorelesoresolvererverenn

如何在Java中實現簡單的TCP客戶端? 如何在Java中實現簡單的TCP客戶端? Aug 08, 2025 pm 03:56 PM

Importjava.ioandjava.net.SocketforI/Oandsocketcommunication.2.CreateaSocketobjecttoconnecttotheserverusinghostnameandport.3.UsePrintWritertosenddataviaoutputstreamandBufferedReadertoreadserverresponsesfrominputstream.4.Usetry-with-resourcestoautomati

用Docker將Java應用程序部署到Kubernetes 用Docker將Java應用程序部署到Kubernetes Aug 08, 2025 pm 02:45 PM

容器化Java應用:創建Dockerfile,使用基礎鏡像如eclipse-temurin:17-jre-alpine,複製JAR文件並定義啟動命令,通過dockerbuild構建鏡像並用dockerrun測試本地運行。 2.推送鏡像到容器註冊表:使用dockertag標記鏡像並推送到DockerHub等註冊表,需先登錄dockerlogin。 3.部署到Kubernetes:編寫deployment.yaml定義Deployment,設置副本數、容器鏡像和資源限制,編寫service.yaml創建

VS代碼快捷方式專注於Explorer面板 VS代碼快捷方式專注於Explorer面板 Aug 08, 2025 am 04:00 AM

VSCode中可通過快捷鍵快速切換面板與編輯區。要跳轉至左側資源管理器面板,使用Ctrl Shift E(Windows/Linux)或Cmd Shift E(Mac);返回編輯區可用Ctrl `或Esc或Ctrl 1~9。相比鼠標操作,鍵盤快捷鍵更高效且不打斷編碼節奏。其他技巧包括:Ctrl KCtrl E聚焦搜索框,F2重命名文件,Delete刪除文件,Enter打開文件,方向鍵展開/收起文件夾。

修復:Windows Update無法安裝 修復:Windows Update無法安裝 Aug 08, 2025 pm 04:16 PM

runthewindowsupdatetrubloubleshooterviaSettings>更新&安全> is esseShootsoAtomationfixCommonissues.2.ResetWindowSupDateComponentsByStoppingRealatedServices,RenamingTheSoftWaredWaredWaredSoftwaredSistribution andCatroot2Folders,intrestrestartingthertingthertingtherserviceSteStoceTocle

Java對象的序列化過程是什麼? Java對象的序列化過程是什麼? Aug 08, 2025 pm 04:03 PM

JavaserializationConvertSanObject'SstateIntoAbyTeSteAmForStorageorTransermission,andDeserializationReconstructstheObjectStheObjectFromThstream.1.toenableserialization,aclassMustimustimplementTheSerializableizableface.2.UseObjectObjectObjectObjectOutputputputputputtreamToserialializeanobectizeanobectementeabectenobexpent,savin

如何在Java中使用一個時循環 如何在Java中使用一個時循環 Aug 08, 2025 pm 04:04 PM

AwhileloopinJavarepeatedlyexecutescodeaslongastheconditionistrue;2.Initializeacontrolvariablebeforetheloop;3.Definetheloopconditionusingabooleanexpression;4.Updatethecontrolvariableinsidethelooptopreventinfinitelooping;5.Useexampleslikeprintingnumber

python numpy線性代數示例 python numpy線性代數示例 Aug 07, 2025 pm 04:52 PM

NumPy是Python中進行科學計算的核心庫,擅長處理線性代數運算,提供高效的ndarray數組和numpy.linalg模塊中的函數。 1.使用np.linalg.solve(A,b)可求解線性方程組Ax=b,得到解向量x;2.矩陣轉置通過A.T實現;3.矩陣乘法可用np.dot(A,B)或A@B;4.矩陣逆通過np.linalg.inv(A)計算,需確保矩陣可逆;5.行列式由np.linalg.det(A)給出;6.特徵值與特徵向量通過np.linalg.eig(A)求得,特徵向量已歸一化;

See all articles