AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Java 21:虛擬線程介紹

來源: 責編: 時間:2023-10-10 18:32:02 279觀看
導讀Java 21 版本更新中最重要的功能之一就是虛擬線程 (JEP 444)。這些輕量級線程減少了編寫、維護和觀察高吞吐量并發應用程序所需的工作量。正如我的許多其他文章一樣,在推出新功能之前,讓我們先看看 Java 21 版本更新前

Java 21 版本更新中最重要的功能之一就是虛擬線程 (JEP 444)。這些輕量級線程減少了編寫、維護和觀察高吞吐量并發應用程序所需的工作量。GiA28資訊網——每日最新資訊28at.com

正如我的許多其他文章一樣,在推出新功能之前,讓我們先看看 Java 21 版本更新前的現狀,以便更好地了解 Java 21 版本試圖解決的問題以及好處是什么。GiA28資訊網——每日最新資訊28at.com

平臺線程

在引入虛擬線程之前,java.lang.Thread 包已經支持所謂的平臺線程。GiA28資訊網——每日最新資訊28at.com

這些線程通常以 1:1 的方式映射到操作系統調度的內核線程。操作系統線程相當“重”。這使得它們可以執行所有類型的任務。GiA28資訊網——每日最新資訊28at.com

根據操作系統和 JVM 啟動參數配置的不同,一個平臺線程默認消耗 1 MB 的空間。因此如果我們想在重負載高并發應用程序中使用一百萬個線程,我們最好有超過 1 TB 的空閑內存!GiA28資訊網——每日最新資訊28at.com

如上所述,平臺線程有一個明顯的內存瓶頸限制了我們實際上可以擁有的線程數量。GiA28資訊網——每日最新資訊28at.com

每個請求一個線程

每個請求使用單個線程有很多優點,例如更容易的狀態管理和清理。但它也造成了可擴展性限制。應用程序的“并發單元”(在本例中為請求)需要單個“并發平臺單元”(在本例中也就是平臺線程),但是在重負載高并發應用程序中,平臺線程容易因為內存不足、CPU 資源耗盡而創建失敗。GiA28資訊網——每日最新資訊28at.com

盡管“每個請求一個線程”有很多優點,平臺線程可以更均勻地利用硬件,但我們還是需要一種完全不同的方法。GiA28資訊網——每日最新資訊28at.com

使用線程池

與在單個線程上處理以個請求不同,當任務完成時,線程會被線程池回收,因此另一個請求可能會重用相同的線程。這允許我們的程序使用更少的線程處理更多的請求,但會帶來異步編程的負擔。GiA28資訊網——每日最新資訊28at.com

異步編程具有自己的范例,具有一定的學習曲線,并且可能使我們的程序更難以理解和遵循。請求的每個部分可能在不同的線程上執行,在沒有合理上下文的情況下創建堆棧跟蹤,并使調試變得非常棘手甚至幾乎不可能。GiA28資訊網——每日最新資訊28at.com

重新審視“每個請求一個線程”模型,很明顯,我們需要一種更輕量級的線程方法來解決這個瓶頸,并最好按照我們熟悉的方式。GiA28資訊網——每日最新資訊28at.com

輕量級線程

由于平臺線程的數量在不新增硬件資源的情況下無法改變,因此也就需要另一層抽象,以切斷首先產生瓶頸的可怕的 1:1 映射。GiA28資訊網——每日最新資訊28at.com

輕量級線程不依賴于特定的平臺線程,也不會為其分配大量內存。它們由運行時的 JVM 調度和管理而不是底層操作系統。這就是為什么可以創建大量輕量級線程的原因。GiA28資訊網——每日最新資訊28at.com

輕量級線程的概念并不新鮮,許多語言都有某種形式的輕量級線程:GiA28資訊網——每日最新資訊28at.com

  • Go 語言中的 Goroutines(協程)
  • Erlang 語言中的 Processes(輕量級進程)
  • Haskell Threads

Java 也在 21 版本中引入了自己的輕量級線程實現:虛擬線程。GiA28資訊網——每日最新資訊28at.com

虛擬線程

虛擬線程是一個新的輕量級 java.lang.Thread 變體,是 Project Loom 項目的一部分,不由操作系統管理或調度。相反由 JVM 負責調度。當然在實際工作反映到操作系統還是以平臺線程運行,但 JVM 正是利用所謂的載體線程(即平臺線程)來“承載”虛擬線程,以便在需要時執行。GiA28資訊網——每日最新資訊28at.com

JVM / OS 線程調度示意圖JVM / OS 線程調度示意圖GiA28資訊網——每日最新資訊28at.com

所需的平臺線程以 FIFO 工作方式在 ForkJoinPool 中進行管理,默認情況下,它使用所有可用的處理器,但可以通過調整系統屬性 jdk.virtualThreadScheduler.parallelism 來根據我們的要求進行修改。我們熟悉的 ForkJoinPool 與并行流等其他功能使用的公共池之間的主要區別在于,公共池以 LIFO 模式運行。GiA28資訊網——每日最新資訊28at.com

物美價廉

虛擬線程是廉價且輕量級的,我們可以使用“每個請求一個線程”模型,而不必擔心實際需要多少個線程。如果我們的代碼在虛擬線程中調用阻塞 I/O 操作,則運行時會掛起這個被阻塞的虛擬線程,直到掛起結束后就可以恢復。這樣一來,程序對硬件的利用就可以達到近乎最佳并提供高水平的并發性,從而實現高吞吐量。GiA28資訊網——每日最新資訊28at.com

因為虛擬線程非常便宜,所以虛擬線程不會被重用或需要被池化。每個任務都由其自己的虛擬線程來執行。GiA28資訊網——每日最新資訊28at.com

設定界限

JVM 調度程序通過載體線程來管理虛擬線程,因此需要一定的邊界和分隔來確??赡艿摹盁o數”虛擬線程按預期運行。這是通過在載體線程和它可能承載的任何虛擬線程之間保持無線程關聯來實現的:GiA28資訊網——每日最新資訊28at.com

  • 虛擬線程無法訪問載體線程,Thread.currentThread() 返回虛擬線程本身。
  • 堆棧跟蹤是獨立的,虛擬線程中拋出的任何異常僅包含其自己的堆棧幀。
  • 虛擬線程的線程局部變量對其載體線程不可用,反之亦然。
  • 從代碼的角度來看,載體線程及其虛擬線程對平臺線程的共享是不可見的。

代碼展示

在我看來,虛擬線程最好的事情之一就是我們不需要學習新的編程范例或復雜的新 API,就能夠完成異步編程。在使用上,我們可以像對待平臺線程一樣對待虛擬線程。GiA28資訊網——每日最新資訊28at.com

創建平臺線程

創建平臺線程很簡單,就像使用 Runnable 創建一樣:GiA28資訊網——每日最新資訊28at.com

Runnable fn = () -> {  // your code here};Thread thread = new Thread(fn).start();

隨著 Project Loom 項目簡化了新的并發方法,還提供了一種創建平臺線程的新方法:GiA28資訊網——每日最新資訊28at.com

Thread thread = Thread.ofPlatform().                      .start(runnable);

實際上,現在有一個完整的 Fluent API,因為 ofPlatform() 返回一個 Thread.Builder.OfPlatform 實例:GiA28資訊網——每日最新資訊28at.com

Thread thread = Thread.ofPlatform().                      .daemon()                      .name("my-custom-thread")                      .unstarted(runnable);

但你來這里顯然不是為了學習創建“舊”線程的新方法,你想要新的東西!GiA28資訊網——每日最新資訊28at.com

創建虛擬線程

對于虛擬線程,同樣有一個 Fluent API:GiA28資訊網——每日最新資訊28at.com

Runnable fn = () -> {  // your code here};Thread thread = Thread.ofVirtual(fn)                      .start();

除了構建器方法之外,我們還可以直接使用以下命令創建虛擬線程:GiA28資訊網——每日最新資訊28at.com

Thread thread = Thread.startVirtualThread(() -> {  // your code here});

由于所有虛擬線程始終都是守護線程,因此如果我們想在主線程上等待虛擬線程執行完畢,可以調用 join() 方法。GiA28資訊網——每日最新資訊28at.com

創建虛擬線程的另一種方法是使用 Executor 類:GiA28資訊網——每日最新資訊28at.com

var executorService = Executors.newVirtualThreadPerTaskExecutor();executorService.submit(() -> {  // your code here});

總結

盡管作用域值 (JEP 446) 和結構化并發 (JEP 453) 仍然是 Java 21 中的預覽功能,但虛擬線程已經成為可投入生產的成熟功能。GiA28資訊網——每日最新資訊28at.com

虛擬線程是一種通用且強大的 Java 并發新方式,將對我們的未來程序產生重大影響。虛擬線程使用熟悉且可靠的“每個請求一個線程”方法,同時以最佳方式利用所有可用硬件,無需學習新范例或復雜的 API。GiA28資訊網——每日最新資訊28at.com

本文翻譯自國外論壇 medium,原文地址:https://medium.com/@benweidig/looking-at-java-21-virtual-threads-0ddda4ac1be1GiA28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-12741-0.htmlJava 21:虛擬線程介紹

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入解析整潔架構 Clean Architecture:構建靈活、測試維護的應用

下一篇: 使用 Helm 管理應用的一些 Tips

標簽:
  • 熱門焦點
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網消息,據彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 聯想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯想小新Pad Pro 12.6將于秋季新品會上推出,官方按照慣例直接在發布會前給出了機型的所有參數。聯想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
  • onebot M24巧系列一體機采用輕薄機身設計,現已在各平臺開售

    onebot M24 巧系列一體機目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機身設計,最薄處為 10.15mm,擁有寶石紅、午夜藍、石墨綠、雅致
Top