成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Java知識點總結(jié)之JDK19虛擬線程

本篇文章給大家?guī)砹岁P于java的相關知識,其中主要介紹了關于jdk19中虛擬線程的相關內(nèi)容,虛擬線程是具有和go語言的goroutines 和 Erlang 語言的進程類似的實現(xiàn)方式,它們是用戶模式線程的一種形式,下面一起來看一下,希望對大家有幫助。

Java知識點總結(jié)之JDK19虛擬線程

程序員必備接口測試調(diào)試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設計、調(diào)試、文檔、自動化測試工具
后端、前端、測試,同時在線協(xié)作,內(nèi)容實時同步

推薦學習:《java視頻教程》

介紹

虛擬線程具有和 Go 語言的 goroutines 和 Erlang 語言的進程類似的實現(xiàn)方式,它們是用戶模式(user-mode)線程的一種形式。

在過去 Java 中常常使用線程池來進行平臺線程的共享以提高對計算機硬件的使用率,但在這種異步風格中,請求的每個階段可能在不同的線程上執(zhí)行,每個線程以交錯的方式運行屬于不同請求的階段,與 Java 平臺的設計不協(xié)調(diào)從而導致:

  • 堆棧跟蹤不提供可用的上下文

  • 調(diào)試器不能單步執(zhí)行請求處理邏輯

  • 分析器不能將操作的成本與其調(diào)用方關聯(lián)。

而虛擬線程既保持與平臺的設計兼容,同時又能最佳地利用硬件從而不影響可伸縮性。虛擬線程是由 JDK 而非操作系統(tǒng)提供的線程的輕量級實現(xiàn):

  • 虛擬線程是沒有綁定到特定操作系統(tǒng)線程的線程。

  • 平臺線程是以傳統(tǒng)方式實現(xiàn)的線程,作為圍繞操作系統(tǒng)線程的簡單包裝。

摘要

向 Java 平臺引入虛擬線程。虛擬線程是輕量級線程,它可以大大減少編寫、維護和觀察高吞吐量并發(fā)應用程序的工作量。

目標

  • 允許以簡單的每個請求一個線程的方式編寫的服務器應用程序以接近最佳的硬件利用率進行擴展。

  • 允許使用 java.lang.ThreadAPI 的現(xiàn)有代碼采用虛擬線程,并且只做最小的更改。

  • 使用現(xiàn)有的 JDK 工具可以方便地對虛擬線程進行故障排除、調(diào)試和分析。

非目標

  • 移除線程的傳統(tǒng)實現(xiàn)或遷移現(xiàn)有應用程序以使用虛擬線程并不是目標。

  • 改變 Java 的基本并發(fā)模型。

  • 我們的目標不是在 Java 語言或 Java 庫中提供新的資料平行結(jié)構。StreamAPI 仍然是并行處理大型數(shù)據(jù)集的首選方法。

動機

近30年來,Java 開發(fā)人員一直依賴線程作為并發(fā)服務器應用程序的構件。每個方法中的每個語句都在一個線程中執(zhí)行,而且由于 Java 是多線程的,因此執(zhí)行的多個線程同時發(fā)生。

線程是 Java 的并發(fā)單元: 一段順序代碼,與其他這樣的單元并發(fā)運行,并且在很大程度上獨立于這些單元。

每個線程都提供一個堆棧來存儲本地變量和協(xié)調(diào)方法調(diào)用,以及出錯時的上下文: 異常被同一個線程中的方法拋出和捕獲,因此開發(fā)人員可以使用線程的堆棧跟蹤來查找發(fā)生了什么。

線程也是工具的一個核心概念: 調(diào)試器遍歷線程方法中的語句,分析器可視化多個線程的行為,以幫助理解它們的性能。

兩種并發(fā) style

thread-per-request style

  • 服務器應用程序通常處理彼此獨立的并發(fā)用戶請求,因此應用程序通過在整個請求持續(xù)期間為該請求分配一個線程來處理請求是有意義的。這種按請求執(zhí)行線程的 style 易于理解、易于編程、易于調(diào)試和配置,因為它使用平臺的并發(fā)單元來表示應用程序的并發(fā)單元。

  • 服務器應用程序的可伸縮性受到利特爾定律(Little's Law)的支配,該定律關系到延遲、并發(fā)性和吞吐量: 對于給定的請求處理持續(xù)時間(延遲) ,應用程序同時處理的請求數(shù)(并發(fā)性) 必須與到達速率(吞吐量) 成正比增長。

  • 例如,假設一個平均延遲為 50ms 的應用程序通過并發(fā)處理 10 個請求實現(xiàn)每秒 200 個請求的吞吐量。為了使該應用程序的吞吐量達到每秒 2000 個請求,它將需要同時處理 100 個請求。如果在請求持續(xù)期間每個請求都在一個線程中處理,那么為了讓應用程序跟上,線程的數(shù)量必須隨著吞吐量的增長而增長。

  • 不幸的是,可用線程的數(shù)量是有限的,因為 JDK 將線程實現(xiàn)為操作系統(tǒng)(OS)線程的包裝器。操作系統(tǒng)線程代價高昂,因此我們不能擁有太多線程,這使得實現(xiàn)不適合每個請求一個線程的 style 。

  • 如果每個請求在其持續(xù)時間內(nèi)消耗一個線程,從而消耗一個 OS 線程,那么線程的數(shù)量通常會在其他資源(如 CPU 或網(wǎng)絡連接)耗盡之前很久成為限制因素。JDK 當前的線程實現(xiàn)將應用程序的吞吐量限制在遠低于硬件所能支持的水平。即使在線程池中也會發(fā)生這種情況,因為池有助于避免啟動新線程的高成本,但不會增加線程的總數(shù)。

asynchronous style

一些希望充分利用硬件的開發(fā)人員已經(jīng)放棄了每個請求一個線程(thread-per-request) 的 style ,轉(zhuǎn)而采用線程共享(thread-sharing ) 的 style 。

請求處理代碼不是從頭到尾處理一個線程上的請求,而是在等待 I/O 操作完成時將其線程返回到一個池中,以便該線程能夠處理其他請求。這種細粒度的線程共享(其中代碼只在執(zhí)行計算時保留一個線程,而不是在等待 I/O 時保留該線程)允許大量并發(fā)操作,而不需要消耗大量線程。

雖然它消除了操作系統(tǒng)線程的稀缺性對吞吐量的限制,但代價很高: 它需要一種所謂的異步編程 style ,采用一組獨立的 I/O 方法,這些方法不等待 I/O 操作完成,而是在以后將其完成信號發(fā)送給回調(diào)。如果沒有專門的線程,開發(fā)人員必須將請求處理邏輯分解成小的階段,通常以 lambda 表達式的形式編寫,然后將它們組合成帶有 API 的順序管道(例如,參見 CompletableFuture,或者所謂的“反應性”框架)。因此,它們放棄了語言的基本順序組合運算符,如循環(huán)和 try/catch 塊。

在異步樣式中,請求的每個階段可能在不同的線程上執(zhí)行,每個線程以交錯的方式運行屬于不同請求的階段。這對于理解程序行為有著深刻的含義:

  • 堆棧跟蹤不提供可用的上下文

  • 調(diào)試器不能單步執(zhí)行請求處理邏輯

  • 分析器不能將操作的成本與其調(diào)用方關聯(lián)。

當使用 Java 的流 API 在短管道中處理數(shù)據(jù)時,組合 lambda 表達式是可管理的,但是當應用程序中的所有請求處理代碼都必須以這種方式編寫時,就有問題了。這種編程 style 與 Java 平臺不一致,因為應用程序的并發(fā)單元(異步管道)不再是平臺的并發(fā)單元。

對比

Java知識點總結(jié)之JDK19虛擬線程

使用虛擬線程保留thread-per-request style

為了使應用程序能夠在與平臺保持和諧的同時進行擴展,我們應該通過更有效地實現(xiàn)線程來努力保持每個請求一個線程的 style ,以便它們能夠更加豐富。

操作系統(tǒng)無法更有效地實現(xiàn) OS 線程,因為不同的語言和運行時以不同的方式使用線程堆棧。然而,Java 運行時實現(xiàn) Java 線程的方式可以切斷它們與操作系統(tǒng)線程之間的一一對應關系。正如操作系統(tǒng)通過將大量虛擬地址空間映射到有限數(shù)量的物理 RAM 而給人一種內(nèi)存充足的錯覺一樣,Java 運行時也可以通過將大量虛擬線程映射到少量操作系統(tǒng)線程而給人一種線程充足的錯覺。

  • 虛擬線程是沒有綁定到特定操作系統(tǒng)線程的線程。

  • 平臺線程是以傳統(tǒng)方式實現(xiàn)的線程,作為圍繞操作系統(tǒng)線程的簡單包裝。

thread-per-request 樣式的應用程序代碼可以在整個請求期間在虛擬線程中運行,但是虛擬線程只在 CPU 上執(zhí)行計算時使用操作系統(tǒng)線程。其結(jié)果是與異步樣式相同的可伸縮性,除了它是透明實現(xiàn)的:

當在虛擬線程中運行的代碼調(diào)用 Java.* API 中的阻塞 I/O 操作時,運行時執(zhí)行一個非阻塞操作系統(tǒng)調(diào)用,并自動掛起虛擬線程,直到稍后可以恢復。

對于 Java 開發(fā)人員來說,虛擬線程是創(chuàng)建成本低廉、數(shù)量幾乎無限多的線程。硬件利用率接近最佳,允許高水平的并發(fā)性,從而提高吞吐量,而應用程序仍然與 Java 平臺及其工具的多線程設計保持協(xié)調(diào)。

虛擬線程的意義

虛擬線程是廉價和豐富的,因此永遠不應該被共享(即使用線程池) : 應該為每個應用程序任務創(chuàng)建一個新的虛擬線程。

因此,大多數(shù)虛擬線程的壽命都很短,并且具有淺層調(diào)用堆棧,執(zhí)行的操作只有單個 HTTP 客戶機調(diào)用或單個 JDBC 查詢那么少。相比之下,平臺線程是重量級和昂貴的,因此經(jīng)常必須共享。它們往往是長期存在的,具有深度調(diào)用堆棧,并且在許多任務之間共享。

總之,虛擬線程保留了可靠的 thread-per-request style ,這種 style 與 Java 平臺的設計相協(xié)調(diào),同時又能最佳地利用硬件。使用虛擬線程并不需要學習新的概念,盡管它可能需要為應對當今線程的高成本而養(yǎng)成的忘卻習慣。虛擬線程不僅可以幫助應用程序開發(fā)人員ーー它們還可以幫助框架設計人員提供易于使用的 API,這些 API 與平臺的設計兼容,同時又不影響可伸縮性。

說明

如今,java.lang 的每一個實例。JDK 中的線程是一個平臺線程。平臺線程在底層操作系統(tǒng)線程上運行 Java 代碼,并在代碼的整個生命周期中捕獲操作系統(tǒng)線程。平臺線程的數(shù)量僅限于操作系統(tǒng)線程的數(shù)量。

虛擬線程是 java.lang 的一個實例。在基礎操作系統(tǒng)線程上運行 Java 代碼,但在代碼的整個生命周期中不捕獲該操作系統(tǒng)線程的線程。這意味著許多虛擬線程可以在同一個 OS 線程上運行它們的 Java 代碼,從而有效地共享它們。平臺線程壟斷了一個珍貴的操作系統(tǒng)線程,而虛擬線程卻沒有。虛擬線程的數(shù)量可能比操作系統(tǒng)線程的數(shù)量大得多。

虛擬線程是由 JDK 而非操作系統(tǒng)提供的線程的輕量級實現(xiàn)。它們是用戶模式(user-mode)線程的一種形式,已經(jīng)在其他多線程語言中取得了成功(例如,Go 中的 goroutines 和 Erlang 的進程)。在 Java 的早期版本中,用戶模式線程甚至以所謂的“綠線程”為特色,當時 OS 線程還不成熟和普及。然而,Java 的綠色線程都共享一個 OS 線程(M: 1調(diào)度) ,并最終被平臺線程超越,實現(xiàn)為 OS 線程的包裝器(1:1調(diào)度)。虛擬線程采用 M: N 調(diào)度,其中大量(M)虛擬線程被調(diào)度在較少(N)操作系統(tǒng)線程上運行。

虛擬線程 VS 平臺線程

簡單示例

開發(fā)人員可以選擇使用虛擬線程還是平臺線程。下面是一個創(chuàng)建大量虛擬線程的示例程序。該程序首先獲得一個 ExecutorService,它將為每個提交的任務創(chuàng)建一個新的虛擬線程。然后,它提交10000項任務,等待所有任務完成:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {     IntStream.range(0, 10000).forEach(i -> {         executor.submit(() -> {             Thread.sleep(Duration.ofSeconds(1));             return i;         });     }); }  // executor.close() is called implicitly, and waits
登錄后復制

本例中的任務是簡單的代碼(休眠一秒鐘) ,現(xiàn)代硬件可以輕松支持10,000個虛擬線程并發(fā)運行這些代碼。在幕后,JDK 在少數(shù)操作系統(tǒng)線程上運行代碼,可能只有一個線程。

如果這個程序使用 ExecutorService 為每個任務創(chuàng)建一個新的平臺線程,比如 Executors.newCachedThreadPool () ,那么情況就會大不相同。ExecutorService 將嘗試創(chuàng)建10,000個平臺線程,從而創(chuàng)建10,000個 OS 線程,程序可能會崩潰,這取決于計算機和操作系統(tǒng)。

相反,如果程序使用從池中獲取平臺線程的 ExecutorService (例如 Executors.newFixedThreadPool (200)) ,情況也不會好到哪里去。ExecutorService 將創(chuàng)建200個平臺線程,由所有10,000個任務共享,因此許多任務將按順序運行,而不是并發(fā)運行,而且程序?qū)⑿枰荛L時間才能完成。對于這個程序,一個有200個平臺線程的池只能達到每秒200個任務的吞吐量,而虛擬線程達到每秒10,000個任務的吞吐量(在充分預熱之后)。此外,如果示例程序中的10000被更改為1000000,那么該程序?qū)⑻峤?,000,000個任務,創(chuàng)建1,000,000個并發(fā)運行的虛擬線程,并且(在足夠的預熱之后)實現(xiàn)大約1,000,000任務/秒的吞吐量。

如果這個程序中的任務執(zhí)行一秒鐘的計算(例如,對一個巨大的數(shù)組進行排序)而不僅僅是休眠,那么增加超出處理器核心數(shù)量的線程數(shù)量將無濟于事,無論它們是虛擬線程還是平臺線程。

虛擬線程并不是更快的線程ーー它們運行代碼的速度并不比平臺線程快。它們的存在是為了提供規(guī)模(更高的吞吐量) ,而不是速度(更低的延遲) 。它們的數(shù)量可能比平臺線程多得多,因此根據(jù) Little’s Law,它們能夠?qū)崿F(xiàn)更高吞吐量所需的更高并發(fā)性。

換句話說,虛擬線程可以顯著提高應用程序的吞吐量,在如下情況時:

  • 并發(fā)任務的數(shù)量很多(超過幾千個)

  • 工作負載不受 CPU 限制,因為在這種情況下,比處理器核心擁有

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
国产乱码字幕精品高清AV| AV无码免费一区二区三区| 日日噜噜夜夜狠狠久久蜜桃| IPHONE欧美高级| 亚洲午夜福利在线观看| 无码人妻丰满熟妇啪啪| 啪啪男女爱高潮GIF| 久久婷婷国产剧情内射白浆| 国产免费不卡午夜福利在线| 部长的夫人的味道HD| 坐公交车居然被弄了2个小时| 亚洲精品欧美综合二区| 四十路の五十路熟女豊満AV| 人曾交互MOUSE农场| 美女露0裸体无档动态视频| 精品无码人妻一区二区免费蜜桃| 国产精品久久久久久久稀缺资源| 成 人 A V免费视频在线观看 | 日韩不卡手机视频在线观看| 男男GAYGAY无套GAY无套| 久久久久国产精品熟女影院| 精品国产第一福利网站| 国内精品人妻无码久久久影院| 51VV社区视频在线视频观看| 一本到在线高清视频| 亚洲国产成人久久综合同性| 性国产SE╳O色欲A片免费观看 | 年轻 娇小 亚洲人 日本语 夹| 久久婷婷人人澡人爽人人喊| 欧美性XXXX极品少妇| 男生晚上睡不着想看B站| 日韩高清免费A级毛片| 小婷又软又嫩又紧水又多的视频| 夜夜躁天天躁很很躁| 插花弄玉小说荔枝很甜作者卿凌| 国产人久久人人人人爽| 国产佗精品一区二区三区| 国产丝袜无码一区二区视频 | CHINESE粉嫩VIDEOS| FREESEX性中国熟妇| 国产精品久久久久久久久免费| 久久EE热这里只有精品| 久久久久久久精品免费| 日本理论片YY4800免费| 日本丰满人妻熟妇BBBBB③B| 无遮挡又黄又刺激又爽的视频| 小说蜜汁樱桃林妙妙的结局| 一二三四影视在线看片免费| 中国孕妇变态孕交XXXX| 1—36集电视剧免费观看36集| 中文字幕无码日韩AV| 99RE6热这里只精品首页| BRAZZERSHD欧美大屁股| 国产精品无码一区二区三区| 国色天香精品一卡2卡3卡| 欧美成人AⅤ高清免费观看| 欧美性战A久久久久久| 日日噜噜夜夜狠狠VA视频| 亚洲欧美日韩成人综合网| 伊人久久大香线蕉亚洲五月天| 中文字幕人妻丝袜美腿乱| 国产成人精品999在线观看| 国产免费无码一区二区| 女人被狂躁c到高潮视频| 日本不卡高清兔费V| 特级做A爰片毛片免费69| 又爽又黄又无遮挡网站动态图| CAOPORN最新地址| 好大好爽舔我高潮了| 狂猛欧美激情性XXXX在线观看 | 乌克兰少妇VIDEOS高潮| 亚洲AV最新在线观看网址下载| 亚洲人成国产精品无码果冻| 敌伦交换第11部分给了| 国产亚洲成AV人片在线观看导航 | 国产XXX69麻豆国语对白| 国产一二三四区乱码免费| 久久久久亚洲AV成人网| 欧美成人精品三级又大又粗| 亚洲AV成人精品五区| 尤物在线视频.YW163.成年| 国产精品不卡AⅤ在线播放| 精品多毛少妇人妻AV免费久久| 日韩系列精品无码免费不卡| 小SAO货边洗澡边CAO你动漫| 野花免费观看日本电视剧| MM131极品尤物美女| 国产精品YY9299在线观看| 欧美熟妇与小伙性欧美交| 亚洲在AV极品无码高清| YSL千人千色T9T9T9| 国产乱人伦偷精品视频不卡| 日本大肚子孕妇交XXX| 中国极品少妇XXXXX1314| 东北妓女激情普通话对白| 男男激情H视频Gay片GV| 亚洲人成色77777| 国产男男激情VIDEOSGAY| 色婷婷AV一区二区三区在线观看| 亚洲精品1卡2卡三卡23卡放| Chinese辽宁人妻4p| 久久久久久AV无码免费网站| 新JAPANESEVIDEO乱| 高清WINDOWS免费版| 久久97超碰人人澡人人爱| 人妻无码中文字幕永久有效视频| 亚洲AV香蕉一区区二区三区| AV男人在线东京天堂| 久久人人妻人人妻人人澡av| 亚洲精品二区国产综合野狼| 国产精品泄火熟女| 铜铜铜铜铜铜铜好大好深色板| 一本一道久久A久久精品综合| 国模GOGO中国人体私拍| 无码人妻丰满熟妇区五十路在线 | 天堂AV男人在线播放| 差差差很疼视频无掩丰富| 欧美综合天天夜夜久久| 97在线视频免费观看| 免费无码AV片流白浆在线观看| 无码精品人妻一区二区 | 麻豆影视视频在线观看完整版| 亚洲日本中文字幕乱码在线 | 日本畜禽CORPORATION| 爆乳2把你榨干哦OVA在线观看| 精品国产VA久久久久久久冰| 性XXXXX大片免费视频| 国产精品宾馆在线精品酒店| 同性男男黄G片免费网站| 国产成A人亚洲精V品无码| 熟妇人妻中文字幕| a 成 人小说网站在线观看| 国产午夜福利精品久久2021| 无码中文亚洲AV影音先锋无码 | 女生输了给对方玩一个月| 最新 国产 精品 精品 视频| 免费韩国漫画网站观看| 亚洲国产成人精品无码区在线网站 | 国精产品W灬源码1688伊在| 亚洲AV无码一区二区二三区下载 | 欧美激情视频一区| 亚洲欧美日韩精品久久| 久久97人妻AⅤ无码一区 | 无码专区人妻系列日韩| 国产麻花豆剧传媒精品MV在线| 亚洲AV无码久久精品蜜桃| 精品人妻中文无码AV在线| 一本久久伊人热热精品中文| 麻豆AV一区二区三区| 亚洲AV永久无码天堂网| 精品人妻码一区二区三区| 无码国产成人久久| 国产亚洲成AV片在线观看蜜桃 | 调教秘书跪趴撅起来打光屁股作文| 国产成人精品一区二区三区无码| 无人区码一码二码三码医生系列| 国内精品久久久久久久久齐齐| 亚洲国产精品无码中文在线| 久久精品一区二区三区中文字幕 | 日本黄页网站免费观看| 丰满少妇大力进入| 人妻中文字幕在线| 国产AV无码一区二区二三区J| 午夜福利YW在线观看2020| 激情内射亚州一区二区三区爱妻| 透明奶罩的邻居三级在线观看| 国产麻豆成人传媒免费观看| 亚洲AV无码专区在线观看下载 | 国产伦精品一区二区三区免费 | 男女啪啪免费观看网站| 宝贝腿开大点我添添公视频免费| 他将头埋进双腿间吮小核| 狠狠久久精品中文字幕无码| 无码国产69精品久久久久APP| 好了AV第四综合无码久久 | 疯狂做受XXXX高潮欧美日本| 亚洲AⅤ永久无码中文字幕| 久久久久久久精品国产亚洲| ASS亚洲熟妇毛茸茸PICS| 熟女高潮精品一区二区绯乐| 黑人性狂欢在线播放| .一区二区三区在线 | 欧洲| 久久永久免费人妻精品直播| 亚洲中文字幕AV在天堂| 欧美XXXⅩ重口变态调教| 丰满爆乳一区二区三区| 亚洲国产成人久久精品99| 欧美成人精品高清视频在线观看| 国产AV大学生第一次破| 亚洲精品国精品久久99热| 欧美熟VIDEOS肥婆| 国产美女在线精品免费观看| 在厨房拨开内裤进入毛片| 免费观看A级毛片| 动漫成人无码免费视频在线播| 色欲av蜜臀一区二区三区vr| 丰满熟妇人妻AV无码区| 亚洲欧美综合人成在线| 人妻系列无码专区69影院| 狠狠色丁香久久婷婷综合五月 |