Project Loom 正在積極開發(fā)中,最近已針對 JDK 19 作為預(yù)覽功能,其目標(biāo)是更容易編寫、調(diào)試和維護(hù)并發(fā) Java 應(yīng)用程序。詳細(xì)了解 Project Loom 的并發(fā)模型和虛擬線程。通過java培訓(xùn),你可以學(xué)習(xí)更多java框架,以提高java技能。
Java中的線程是什么?什么是虛擬線程?
在Java和一般計算中,線程是一個獨(dú)立的執(zhí)行流。它告訴你的程序做一些事情。有了線程,你可以讓多件事情同時發(fā)生。
Java中的傳統(tǒng)線程非常繁重,并且與操作系統(tǒng)線程一對一綁定,這使得調(diào)度線程成為操作系統(tǒng)的工作。這意味著線程的執(zhí)行時間取決于CPU。虛擬線程,也稱為綠色線程或用戶線程,將調(diào)度的責(zé)任從操作系統(tǒng)轉(zhuǎn)移到應(yīng)用程序,在本例中是JVM。這允許JVM在決定下一步調(diào)度哪個線程時,利用它對虛擬線程中發(fā)生的事情的了解。
虛擬線程的優(yōu)勢
今天,Java大量用于后端web應(yīng)用程序,為來自用戶和其他應(yīng)用程序的并發(fā)請求提供服務(wù)。在傳統(tǒng)的阻塞I/O中,線程在等待數(shù)據(jù)被讀取或?qū)懭霑r會阻塞繼續(xù)執(zhí)行。由于線程的繁重,應(yīng)用程序可以擁有的線程數(shù)量是有限的,因此應(yīng)用程序可以處理的并發(fā)連接數(shù)量也是有限的。這個約束意味著線程不能很好地伸縮。想要學(xué)習(xí)java更多知識和技能,可以考慮參加java培訓(xùn),有經(jīng)驗豐富的專業(yè)講師指導(dǎo)教學(xué),有緊跟市場需求的實(shí)時課程,可以讓你快速掌握這門技術(shù),節(jié)約時間,少走彎路。
長期以來,解決這個問題的方法是使用非阻塞的異步I/O。當(dāng)使用異步I/O時,單線程可以處理許多并發(fā)連接,但代價是增加了代碼的復(fù)雜性。處理單個連接的單個執(zhí)行流更容易理解和推理。雖然今天的許多框架,特別是反應(yīng)式框架,對開發(fā)人員隱藏了許多這種復(fù)雜性,但是異步I/O需要不同的思維方式。
為什么要使用Project Loom?
這就是織機(jī)項目的用武之地。虛擬線程讓開發(fā)人員有機(jī)會使用傳統(tǒng)的阻塞I/O進(jìn)行開發(fā),因為虛擬線程的一大好處是阻塞一個虛擬線程不會阻塞整個操作系統(tǒng)線程。這消除了阻塞I/O的可伸縮性問題,但沒有使用異步I/O所增加的代碼復(fù)雜性,因為我們回到了只監(jiān)督單個連接的單個線程。
使用 Project Loom 擴(kuò)展 Java 線程
使用虛擬線程進(jìn)行開發(fā)與使用傳統(tǒng)線程進(jìn)行開發(fā)幾乎相同,增強(qiáng)提案為此添加了幾個 API 方法。在java培訓(xùn)中,也有關(guān)于線程的學(xué)習(xí),理論知識+實(shí)踐項目,雙管齊下,學(xué)以致用,讓你深入淺出地學(xué)習(xí)java。
Thread類本身有一些添加的方法,例如Thread.ofVirtual(),它們返回一個構(gòu)建器來啟動虛擬線程或創(chuàng)建一個ThreadFactory。同樣,已添加Executors.newVirtualThreadPerTaskExecutor() 以創(chuàng)建使用虛擬線程的ExecutorService。在許多情況下,切換到使用這些來創(chuàng)建ExecutorService 或ThreadFactory就足以利用虛擬線程!
與任何其他預(yù)覽功能一樣,要利用它,你需要在編譯和運(yùn)行時添加 --enable-preview JVM 參數(shù)。
Project Loom和Java 的未來
盡管異步 I/O 很難,但很多人已經(jīng)成功地做到了,但這種思維方式的轉(zhuǎn)變并未被廣泛采用。Netflix 以使用響應(yīng)式編程而廣為人知,并且是響應(yīng)式編程框架的重要貢獻(xiàn)者,但即使他們最近也縮減了使用量。
雖然虛擬線程不會神奇地讓一切運(yùn)行得更快,但針對當(dāng)前早期訪問版本運(yùn)行的基準(zhǔn)測試表明,你可以獲得與使用異步I/O時相似的可伸縮性、吞吐量和性能。對java感興趣的同學(xué)可以報名參加java培訓(xùn)來獲得更加全面系統(tǒng)的學(xué)習(xí)。
在虛擬線程的當(dāng)前實(shí)現(xiàn)中,虛擬線程調(diào)度器是一個工作竊取 fork-join 池。對于大多數(shù)人來說,這可能就是所需要的。但是已經(jīng)提出了能夠提供你自己的調(diào)度程序來代替使用的請求。雖然當(dāng)前預(yù)覽版目前不支持此功能,但我們可能會在未來的改進(jìn)或增強(qiáng)提案中看到它。
虛擬線程目前的目標(biāo)是作為預(yù)覽功能包含在JDK 19中。如果一切順利,虛擬線程應(yīng)該準(zhǔn)備好在JDK 21發(fā)布時退出預(yù)覽狀態(tài),這可能是下一個LTS版本。
對于早期采用者,已經(jīng)包含在JDK 19的最新早期版本中。因此,如果你愿意,就去嘗試一下,并將你的體驗反饋給OpenJDK開發(fā)人員,這樣他們就可以適應(yīng)和改進(jìn)未來版本的實(shí)現(xiàn)。通過Java培訓(xùn)學(xué)習(xí),有經(jīng)驗豐富的專業(yè)講師面授指導(dǎo)教學(xué)和明確清晰的學(xué)習(xí)路線,可以輕松有效地學(xué)到很多有用的知識和技能。