亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
什麼是項(xiàng)目織機(jī)?
為什麼虛擬線程很重要
示例:傳統(tǒng)與織機(jī)
項(xiàng)目織機(jī)中的關(guān)鍵概念
1。虛擬線程
2。載體線
3。結(jié)構(gòu)化並發(fā)(預(yù)覽)
今天如何使用虛擬線程
1。創(chuàng)建虛擬線程
2。與現(xiàn)有API一起使用
最佳實(shí)踐和陷阱
?做:
?不要:
現(xiàn)實(shí)世界的影響
Web服務(wù)器
資料庫
微服務(wù)
當(dāng)不使用虛擬線程
最後的想法
入門
首頁 Java java教程 Java平臺線程的權(quán)威指南(項(xiàng)目織機(jī))

Java平臺線程的權(quán)威指南(項(xiàng)目織機(jī))

Jul 28, 2025 am 01:48 AM

Project Loom向Java引入了輕巧的虛擬線程,簡化了高通量並發(fā)應(yīng)用程序的開發(fā)。 1。虛擬線程是輕巧的JVM管理的線程,可以在沒有OS支持的平臺線程開銷的情況下實(shí)現(xiàn)巨大的並發(fā)性。 2。它們允許同步,阻止代碼有效地?cái)U(kuò)展,從而消除了大多數(shù)情況下對複雜的異步模型的需求。 3。虛擬線程在載波線程(平臺線程)上運(yùn)行,JVM在阻止操作期間自動切換它們,以最大程度地利用資源利用率。 4。結(jié)構(gòu)化並發(fā)提供了清晰的任務(wù)層次結(jié)構(gòu),並自動取消和錯誤傳播,從而提高了調(diào)試和可觀察性。 5。截至Java 21,虛擬線程已準(zhǔn)備就緒,可以通過執(zhí)行者使用。 newvirtualThreadPertasKexecutor()或thread.startvirtualthread()。 6。最佳實(shí)踐包括使用虛擬線程進(jìn)行I/O結(jié)合任務(wù),避免匯總,並避免CPU密集型工作。 7。實(shí)際上的好處包括更簡單的Web服務(wù)器並發(fā),有效的JDBC使用和微服務(wù)的複雜性降低。 8。虛擬線程不應(yīng)用於CPU結(jié)合的任務(wù),低頻率應(yīng)用程序或具有過時(shí)的調(diào)試工具的環(huán)境。結(jié)果是開發(fā)人員現(xiàn)在可以編寫簡單,可讀,同步的代碼,該代碼像複雜的異步代碼一樣縮放,使虛擬線程成為服務(wù)器端Java應(yīng)用程序的遊戲改變者。

Java平臺線程的權(quán)威指南(項(xiàng)目織機(jī))

Java平臺線程(更名為Project Loom )是Java平臺中的主要發(fā)展,旨在使編寫,維護(hù)和擴(kuò)展並發(fā)應(yīng)用程序更容易。經(jīng)過多年的OpenJDK傘,Loom有望重塑開發(fā)人員如何看待Java的並發(fā)。本指南分解了什麼是項(xiàng)目織機(jī),為什麼重要以及如何有效地開始使用它。

Java平臺線程的權(quán)威指南(項(xiàng)目織機(jī))

什麼是項(xiàng)目織機(jī)?

Project Loom是一個OpenJDK項(xiàng)目,將輕量級虛擬線程引入Java平臺。它的目標(biāo)是通過大大減少有效使用線程所需的精力來簡化高通量並發(fā)應(yīng)用程序的開發(fā)。

傳統(tǒng)的Java應(yīng)用程序依賴於平臺線程(也稱為OS線程),該線程由JVM管理,但最終由操作系統(tǒng)線程支持。這些在內(nèi)存和安排開銷方面很昂貴。結(jié)果,需要處理數(shù)千或數(shù)百萬個並發(fā)任務(wù)(例如Web服務(wù)器或微服務(wù))的應(yīng)用程序通常求助於復(fù)雜的異步編程模型(例如,完整的future,反應(yīng)流)。

Java平臺線程的權(quán)威指南(項(xiàng)目織機(jī))

織機(jī)通過引入虛擬線程來改變這一點(diǎn),該線程是:

  • 輕量級:可以創(chuàng)建成千上萬或數(shù)百萬的情況,而無需耗盡系統(tǒng)資源。
  • 由JVM管理:它們沒有將1:1綁在OS線程上。
  • Drop-in兼容:他們實(shí)現(xiàn)java.lang.Thread ,因此現(xiàn)有代碼的工作不變。
  • 阻止友好型:與異步型號不同,您可以使用普通synchronized , Thread.sleep()或阻止I/O而無需懲罰。

簡而言之:虛擬線程使簡單,同步的代碼比例像複雜的異步代碼一樣。

Java平臺線程的權(quán)威指南(項(xiàng)目織機(jī))

為什麼虛擬線程很重要

多年來,該行業(yè)一直朝著非阻滯性,反應(yīng)性編程邁進(jìn),以大規(guī)模處理並發(fā)。諸如反應(yīng)流,項(xiàng)目反應(yīng)堆Vert.x之類的框架獲得了普及,因?yàn)槠脚_線程無法有效擴(kuò)展。

但是異步代碼是有代價(jià)的:

  • 更難閱讀和調(diào)試。
  • 複雜的錯誤處理。
  • 堆棧痕跡變得淺而無助。
  • 傳統(tǒng)調(diào)試工具鬥爭。

虛擬線程提供了最佳的世界解決方案:具有直截了當(dāng)?shù)拿钍酱a的高擴(kuò)展性。

示例:傳統(tǒng)與織機(jī)

織機(jī)之前

executorService executor = executors.newfixedThreadPool(10);
intstream.range(0,1000)
    .foreach(i-> executor.submit(() - > {
        thread.sleep(1000);
        system.out.println(“任務(wù)” i“完成”);
        返回null;
    }));

只有10個任務(wù)同時(shí)運(yùn)行。其餘的等待 - 利用率不佳。

織機(jī):

嘗試(var executor = executors.newvirtualThreadPertasKexecutor()){
    intstream.range(0,1000)
        .foreach(i-> executor.submit(() - > {
            thread.sleep(1000);
            system.out.println(“任務(wù)” i“完成”);
            返回null;
        }));
}
//自動關(guān)閉

現(xiàn)在,所有1,000個任務(wù)同時(shí)運(yùn)行,每個任務(wù)都在其自己的虛擬線程中?;A(chǔ)操作系統(tǒng)(載波線程)被有效地使用 - 也許只有幾十個。

這對於服務(wù)器端Java來說是巨大的。


項(xiàng)目織機(jī)中的關(guān)鍵概念

1。虛擬線程

  • JVM計(jì)劃的輕量級線程。
  • 大量創(chuàng)建(思考100k)。
  • 每個運(yùn)行在載波線程(常規(guī)平臺線程)上。
  • 當(dāng)虛擬線塊(I/O,睡眠等)時(shí),JVM將在同一載體上安排另一個- 沒有線程停車位。

2。載體線

  • 執(zhí)行虛擬線程的基礎(chǔ)平臺線程。
  • 默認(rèn)情況下由forkjoinpool管理。
  • 載體數(shù)量≈CPU內(nèi)核數(shù)(可配置)。
  • JVM像操作系統(tǒng)一樣在CPU上使用線程像OS一樣將虛擬線程多路復(fù)用。

3。結(jié)構(gòu)化並發(fā)(預(yù)覽)

Loom引入了用於結(jié)構(gòu)化並發(fā)的新API - 一種確保在父任務(wù)中正確範(fàn)圍和管理子任務(wù)的範(fàn)式。

 try(var scope = new structuredTaskscope.shutdownonfailure()){
    var user = scope.fork(() - > fetchuser());
    var orders = scope.fork(() - > fetchorders());

    scope.join(); //兩個
    Scope.Throwiffailed(); //傳播失敗

    返回新結(jié)果(user.get(),orders.get());
}

好處:

  • 清除任務(wù)層次結(jié)構(gòu)。
  • 自動取消和清理。
  • 更輕鬆的調(diào)試和可觀察性。

這在微服務(wù)和請求分配的處理中特別有用。


今天如何使用虛擬線程

Java 21開始,虛擬線程已準(zhǔn)備就緒,並且沒有標(biāo)誌。

1。創(chuàng)建虛擬線程

選項(xiàng)A:執(zhí)行人(推薦)

嘗試(var executor = executors.newvirtualThreadPertasKexecutor()){
    intstream.range(0,10_000)。 foreach(i->
        executor.submit(() - > {
            thread.sleep(持續(xù)時(shí)間。
            system.out.println(“完成:” i);
            返回null;
        }))
    );
} // executor.shutdown()自動調(diào)用

選項(xiàng)B:手動創(chuàng)建(不常見)

 thread.startvirtualThread(() - > {
    system.out.println(“ hello from Virtual thread!”);
    thread.sleep(1000);
});

2。與現(xiàn)有API一起使用

大多數(shù)阻止代碼的工作原理

  • Thread.sleep()
  • JDBC(即使不是異步)
  • Object.wait() / synchronized
  • 阻止I/O(例如, InputStream.read()

無需重寫您的代碼庫。


最佳實(shí)踐和陷阱

?做:

  • 使用虛擬線程進(jìn)行每個線程模型(例如Web服務(wù)器)。
  • newVirtualThreadPerTaskExecutor()一起使用try-with-resources 。
  • 更喜歡結(jié)構(gòu)化的並發(fā)來進(jìn)行複雜的任務(wù)編排。
  • 將虛擬線程與阻塞I/O一起使用 - 這是他們的最佳選擇。

?不要:

  • 池虛擬線程- 它們便宜地創(chuàng)建;集合打敗了目的。
  • 將它們用於CPU密集型工作- 堅(jiān)持使用平臺線程池(例如, ForkJoinPool )。
  • 假設(shè)它們更快 - 每個任務(wù)的速度不是更快,但是由於更好的可擴(kuò)展性,允許更高的吞吐量。
  • 將虛擬螺紋與螺紋 - 本地濫用混合 - 它們可能會在載體之間遷移,因此除非仔細(xì)使用ThreadLocal.withInitial()仔細(xì),否則可以丟失ThreadLocal值。

現(xiàn)實(shí)世界的影響

Web服務(wù)器

Spring BootTomcat , JettyNetty等框架已經(jīng)在嘗試或支持虛擬線程。

在Spring Boot 6(Spring 6,Java 17)中,您可以啟用虛擬線程:

伺服器:
  線程:
    虛擬的:
      啟用:true

結(jié)果?一臺服務(wù)器使用簡單,可讀的代碼處理數(shù)萬個並發(fā)請求。

資料庫

即使是傳統(tǒng)的JDBC(阻止)在負(fù)載下也很可行,因?yàn)槊總€查詢都在單獨(dú)的虛擬線程中運(yùn)行而無需綁定OS線程。

微服務(wù)

異步鏈中的複雜性降低。沒有更多的thenCompose , flatMapsubscribe()地獄。


當(dāng)不使用虛擬線程

  • CPU結(jié)合任務(wù):使用ForkJoinPool或固定尺寸的平臺線程池。
  • 低電平應(yīng)用程序:如果您只有幾個線程,則無益。
  • 傳統(tǒng)線程本地重型代碼:可能需要重構(gòu)。
  • 調(diào)試工具未更新:一些虛擬線程支持中的一些剖道劑或APM工具滯後(快速改進(jìn))。

最後的想法

Project Loom不僅添加了一個新功能,還可以重新定義編寫並發(fā)Java代碼的默認(rèn)方法。

您不再需要選擇:

  • 簡單性(同步代碼)與可擴(kuò)展性(異步)。
  • 可讀性與性能。

使用虛擬線程,您可以編寫簡單的,阻止的,每次重新要求的代碼,並且仍然擴(kuò)展到大量並發(fā)。

它不是完全替代異步編程的 - 反應(yīng)性模式仍然具有其位置 - 但對於大多數(shù)服務(wù)器端應(yīng)用程序, Loom是一個改變遊戲規(guī)則的人


入門

  1. 使用Java 21或更高版本(建議使用LTS版本)。
  2. 啟動?。河?code>newVirtualThreadPerTaskExecutor() Executors.newCachedThreadPool() ()。
  3. 負(fù)載下測試 - 查看吞吐量如何改善。
  4. 探索複雜工作流程的結(jié)構(gòu)化並發(fā)。

Java並發(fā)的未來就在這裡 - 看起來很像過去,但按比例擴(kuò)大了100倍。

基本上,如果您正在編寫服務(wù)器端Java,請立即開始使用虛擬線程。

以上是Java平臺線程的權(quán)威指南(項(xiàng)目織機(jī))的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Java中的'枚舉”類型是什麼? Java中的'枚舉”類型是什麼? Jul 02, 2025 am 01:31 AM

Java中的枚舉(enum)是一種特殊的類,用於表示固定數(shù)量的常量值。 1.使用enum關(guān)鍵字定義;2.每個枚舉值都是該枚舉類型的公共靜態(tài)最終實(shí)例;3.可以包含字段、構(gòu)造函數(shù)和方法,為每個常量添加行為;4.可在switch語句中使用,支持直接比較,並提供name()、ordinal()、values()和valueOf()等內(nèi)置方法;5.枚舉可提升代碼的類型安全性、可讀性和靈活性,適用於狀態(tài)碼、顏色或星期等有限集合場景。

界面隔離原理是什麼? 界面隔離原理是什麼? Jul 02, 2025 am 01:24 AM

接口隔離原則(ISP)要求不強(qiáng)制客戶端依賴未使用的接口。其核心是用多個小而精的接口替代大而全的接口。違反該原則的表現(xiàn)包括:類實(shí)現(xiàn)接口時(shí)拋出未實(shí)現(xiàn)異常、存在大量無效方法實(shí)現(xiàn)、無關(guān)功能被強(qiáng)行歸入同一接口。應(yīng)用方法包括:按常用方法組劃分接口、依據(jù)客戶端使用拆分接口、必要時(shí)使用組合替代多接口實(shí)現(xiàn)。例如將包含打印、掃描、傳真方法的Machine接口拆分為Printer、Scanner和FaxMachine。在小型項(xiàng)目或所有客戶端均使用全部方法時(shí)可適當(dāng)放寬規(guī)則。

現(xiàn)代爪哇的異步編程技術(shù) 現(xiàn)代爪哇的異步編程技術(shù) Jul 07, 2025 am 02:24 AM

Java支持異步編程的方式包括使用CompletableFuture、響應(yīng)式流(如ProjectReactor)以及Java19 中的虛擬線程。 1.CompletableFuture通過鍊式調(diào)用提升代碼可讀性和維護(hù)性,支持任務(wù)編排和異常處理;2.ProjectReactor提供Mono和Flux類型實(shí)現(xiàn)響應(yīng)式編程,具備背壓機(jī)制和豐富的操作符;3.虛擬線程減少並發(fā)成本,適用於I/O密集型任務(wù),與傳統(tǒng)平臺線程相比更輕量且易於擴(kuò)展。每種方式均有適用場景,應(yīng)根據(jù)需求選擇合適工具並避免混合模型以保持簡潔性

Java中可呼叫和可運(yùn)行的差異 Java中可呼叫和可運(yùn)行的差異 Jul 04, 2025 am 02:50 AM

Callable和Runnable在Java中主要有三點(diǎn)區(qū)別。第一,Callable的call()方法可以返回結(jié)果,適合需要返回值的任務(wù),如Callable;而Runnable的run()方法無返回值,適用於無需返回的任務(wù),如日誌記錄。第二,Callable允許拋出checked異常,便於錯誤傳遞;而Runnable必須在內(nèi)部處理異常。第三,Runnable可直接傳給Thread或ExecutorService,而Callable只能提交給ExecutorService,並返回Future對像以

在Java中使用枚舉的最佳實(shí)踐 在Java中使用枚舉的最佳實(shí)踐 Jul 07, 2025 am 02:35 AM

在Java中,枚舉(enum)適合表示固定常量集合,最佳實(shí)踐包括:1.用enum表示固定狀態(tài)或選項(xiàng),提升類型安全和可讀性;2.為枚舉添加屬性和方法以增強(qiáng)靈活性,如定義字段、構(gòu)造函數(shù)、輔助方法等;3.使用EnumMap和EnumSet提高性能和類型安全性,因其基於數(shù)組實(shí)現(xiàn)更高效;4.避免濫用enum,如動態(tài)值、頻繁變更或複雜邏輯場景應(yīng)使用其他方式替代。正確使用enum能提升代碼質(zhì)量並減少錯誤,但需注意其適用邊界。

了解Java Nio及其優(yōu)勢 了解Java Nio及其優(yōu)勢 Jul 08, 2025 am 02:55 AM

JavaNIO是Java1.4引入的新型IOAPI,1)面向緩衝區(qū)和通道,2)包含Buffer、Channel和Selector核心組件,3)支持非阻塞模式,4)相比傳統(tǒng)IO更高效處理並發(fā)連接。其優(yōu)勢體現(xiàn)在:1)非阻塞IO減少線程開銷,2)Buffer提升數(shù)據(jù)傳輸效率,3)Selector實(shí)現(xiàn)多路復(fù)用,4)內(nèi)存映射加快文件讀寫。使用時(shí)需注意:1)Buffer的flip/clear操作易混淆,2)非阻塞下需手動處理不完整數(shù)據(jù),3)Selector註冊需及時(shí)取消,4)NIO並非適用於所有場景。

探索Java中不同的同步機(jī)制 探索Java中不同的同步機(jī)制 Jul 04, 2025 am 02:53 AM

Javaprovidesmultiplesynchronizationtoolsforthreadsafety.1.synchronizedblocksensuremutualexclusionbylockingmethodsorspecificcodesections.2.ReentrantLockoffersadvancedcontrol,includingtryLockandfairnesspolicies.3.Conditionvariablesallowthreadstowaitfor

Java Classloader在內(nèi)部如何工作 Java Classloader在內(nèi)部如何工作 Jul 06, 2025 am 02:53 AM

Java的類加載機(jī)制通過ClassLoader實(shí)現(xiàn),其核心工作流程分為加載、鏈接和初始化三個階段。加載階段由ClassLoader動態(tài)讀取類的字節(jié)碼並創(chuàng)建Class對象;鏈接包括驗(yàn)證類的正確性、為靜態(tài)變量分配內(nèi)存及解析符號引用;初始化則執(zhí)行靜態(tài)代碼塊和靜態(tài)變量賦值。類加載採用雙親委派模型,優(yōu)先委託父類加載器查找類,依次嘗試Bootstrap、Extension和ApplicationClassLoader,確保核心類庫安全且避免重複加載。開發(fā)者可自定義ClassLoader,如URLClassL

See all articles