日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Tomcat 配合虛擬線程,一種新的編程體驗(yàn)

來源: 責(zé)編: 時(shí)間:2023-12-04 09:20:14 236觀看
導(dǎo)讀Java 21 在今年早些時(shí)候的 9 月 19 日就正式發(fā)布,并開始正式引入虛擬線程,但是作為 Java 開發(fā)生態(tài)中老大哥 Spring 并沒有立即跟進(jìn),而是在等待了兩個(gè)月后的 11 月 29 日,伴隨著 Spring Boot 3.2 版本的發(fā)布,在這個(gè)版本中也

3jR28資訊網(wǎng)——每日最新資訊28at.com

Java 21 在今年早些時(shí)候的 9 月 19 日就正式發(fā)布,并開始正式引入虛擬線程,但是作為 Java 開發(fā)生態(tài)中老大哥 Spring 并沒有立即跟進(jìn),而是在等待了兩個(gè)月后的 11 月 29 日,伴隨著 Spring Boot 3.2 版本的發(fā)布,在這個(gè)版本中也終于是引入了對(duì)虛擬線程的支持。3jR28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程的引入標(biāo)志著 Java 在現(xiàn)代編程世界中對(duì)編寫高吞吐量、高并發(fā)應(yīng)用程序提供了更加完美的支持。3jR28資訊網(wǎng)——每日最新資訊28at.com

本文我就帶著大家一起深入了解一波 Tomcat 配合虛擬線程會(huì)帶來怎樣的效果以及虛擬線程對(duì)以后使用 Java 開發(fā)高吞吐量、高并發(fā)應(yīng)用程序時(shí)所帶來的改變。3jR28資訊網(wǎng)——每日最新資訊28at.com

本文大綱如下:3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

Tomcat 使用虛擬線程

啟用虛擬線程

在 Spring Boot 3.2 中,使用 Tomcat 作為 web 容器時(shí),啟用虛擬線程只需要將 spring.threads.virtual.enabled 屬性設(shè)置為 true。3jR28資訊網(wǎng)——每日最新資訊28at.com

這樣 Spinrg Boot 在啟動(dòng) Tomcat 容器時(shí)會(huì)使用一個(gè)虛擬線程執(zhí)行器來代表原有的平臺(tái)線程池。3jR28資訊網(wǎng)——每日最新資訊28at.com

注意這里是虛擬線程執(zhí)行器,不是虛擬線程池哦。3jR28資訊網(wǎng)——每日最新資訊28at.com

源碼解析

在 Spring Boot 3.2 版本以前,Tomcat 默認(rèn)的線程池使用的就是 Java 提供的 ThreadPoolExecutor 線程池,在 3.2 版本以后,Spring Boot 修改了創(chuàng)建線程池的方法如下所以。3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

Tomcat使用何種執(zhí)行器:3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

是否使用虛擬線程執(zhí)行器:3jR28資訊網(wǎng)——每日最新資訊28at.com

可以看到 Tomcat 會(huì)先判斷是否啟用了虛擬線程,啟用了的話就直接創(chuàng)建一個(gè)虛擬線程執(zhí)行器 VirtualThreadExecutor。3jR28資訊網(wǎng)——每日最新資訊28at.com

VirtualThreadExecutor 類是 Tomcat 為了使用虛擬線程作為執(zhí)行器而新增的。他的內(nèi)部代碼中針對(duì)每個(gè)請(qǐng)求任務(wù)都是依賴 Jre21Compat 類處理的。3jR28資訊網(wǎng)——每日最新資訊28at.com

Jre21Compat 類則是 Tomcat 為了兼容 Java21 版本虛擬線程新增的一個(gè)兼容類。這個(gè)類利用反射方法來調(diào)用 Thread.ofVirtual().start(() -> {}) 方法,以便進(jìn)行任務(wù)處理,代碼截圖如下,3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

VirtualThreadExecutor類源碼:3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

Jre21Compat類源碼:3jR28資訊網(wǎng)——每日最新資訊28at.com

雖然以上代碼可以啟用 Tomcat 的虛擬線程支持。但是在 Spring Boot 中其實(shí)不是這樣設(shè)置的。還記得上文提到的在 Spring Boot 3.2 中,使用 Tomcat 作為 web 容器時(shí),啟用虛擬線程只需要將 spring.threads.virtual.enabled 屬性設(shè)置為 true 嗎?3jR28資訊網(wǎng)——每日最新資訊28at.com

Spring Boot 3.2 中是通過 tomcatVirtualThreadsProtocolHandlerCustomizer 方法來兼容虛擬線程啟用邏輯的,@ConditionalOnThreading(Threading.VIRTUAL) 條件用判斷 spring.threads.virtual.enabled 屬性是否啟用。代碼如下,3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)spring.threads.virtual.enabled屬性決定是否啟用虛擬線程:3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

讀取spring.threads.virtual.enabled屬性:3jR28資訊網(wǎng)——每日最新資訊28at.com

到這里其實(shí)本文所需要講的涉及源碼的部分就全部講完了。可以看到 Tomcat 引入虛擬線程并不復(fù)雜,引入后不在需要維護(hù)線程池,減輕了執(zhí)行器的復(fù)雜度。3jR28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程帶來的改變

不知道大家注意到源碼中一個(gè)改變沒有,就是在 Spring Boot 3.2 中,啟用了虛擬線程后,Tomcat 默認(rèn)使用的虛擬線程執(zhí)行器不在需要池化。3jR28資訊網(wǎng)——每日最新資訊28at.com

也就是說,在 Spring Boot 3.2 以后的版本里,我們不在需要設(shè)置 server.tomcat.threads.max 以及 server.tomcat.threads.min-spare 兩個(gè)屬性以控制 Tomcat 線程池的大小了,因?yàn)樗鼔焊鶝]有使用平臺(tái)線程池。3jR28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于 Tomcat 來說,引入虛擬線程,不必在為線程池的維護(hù)而費(fèi)心,還能減輕編程的復(fù)雜度。3jR28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程由 JVM 平臺(tái)負(fù)責(zé)進(jìn)行調(diào)度,它是廉價(jià)且輕量級(jí)的,Tomcat 可以使用 “每個(gè)請(qǐng)求一個(gè)線程” 模型,而不必?fù)?dān)心實(shí)際需要多少個(gè)線程。3jR28資訊網(wǎng)——每日最新資訊28at.com

就算請(qǐng)求任務(wù)在虛擬線程中調(diào)用阻塞 I/O 操作,導(dǎo)致運(yùn)行時(shí)虛擬線程被掛起阻塞,但是只要掛起結(jié)束后該虛擬線程就可以恢復(fù)。3jR28資訊網(wǎng)——每日最新資訊28at.com

使用了虛擬線程后,程序員使用普通的阻塞 API,也可以讓程序?qū)τ布睦眠_(dá)到近乎完美水平,以此提供高水平的并發(fā)性,從而實(shí)現(xiàn)高吞吐量。3jR28資訊網(wǎng)——每日最新資訊28at.com

可以說,虛擬線程的引入,以后程序員就算是使用 Java 中阻塞 API 也可以開發(fā)出高性能、高吞吐量的應(yīng)用程序。3jR28資訊網(wǎng)——每日最新資訊28at.com

jmter 實(shí)測(cè)

在本文中,我還將給各位展示一波 newbeepro 項(xiàng)目升級(jí)到 Spring Boot 3.2 后啟用虛擬線程所帶來的性能提升。3jR28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試服務(wù)器

  • 主機(jī)名稱 VM-16-5-centos
  • 發(fā)行版本 centos-7.9.2009
  • 內(nèi)核版本 3.10.0-1160.88.1.el7.x86_64
  • 系統(tǒng)類型 x86_64
  • 系統(tǒng)配置:2 核 4 G 5M 帶寬

3jR28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試平臺(tái)配置3jR28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試項(xiàng)目

newbee-mall-pro 是 newbee-mall 商城的 pro 版本實(shí)現(xiàn)了推薦算法、商品秒殺、優(yōu)惠卷使用,滑塊驗(yàn)證碼,支付寶支付,中文分詞檢索等高級(jí)功能。3jR28資訊網(wǎng)——每日最新資訊28at.com

項(xiàng)目地址:https://github.com/wayn111/newbee-mall-pro3jR28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試方法

使用 newbee-mall-pro 作為測(cè)試項(xiàng)目將啟用虛擬線程以及未啟用虛擬線程的兩次設(shè)置部署到測(cè)試服務(wù)器上。3jR28資訊網(wǎng)——每日最新資訊28at.com

啟動(dòng)容器:amazoncorretto:21.0.13jR28資訊網(wǎng)——每日最新資訊28at.com

啟動(dòng)參數(shù):java -jar -Xms1024m -Xmx1024m /opt/newbeemall/newbee-mall.jar3jR28資訊網(wǎng)——每日最新資訊28at.com

部署后測(cè)試地址:http://62.234.206.94/newbeemall/index3jR28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試接口為秒殺接口:/newbeemall/seckill/2/c81e728d9d4c2f636f067f89cc14862c/executionFour3jR28資訊網(wǎng)——每日最新資訊28at.com

壓測(cè)設(shè)置:?jiǎn)⒂?2000 個(gè)線程,每個(gè)線程循環(huán)執(zhí)行 30 秒左右。一共測(cè)試五輪,先預(yù)熱 JVM 后,取吞吐量最大值。3jR28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試數(shù)據(jù)

啟用虛擬線程

壓測(cè)結(jié)果如下,3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

可以看到 CPU 占用達(dá)到百分之 142,內(nèi)存占用達(dá)到百分之 35 的情況下,壓測(cè)吞吐量最大可以達(dá)到 1731。3jR28資訊網(wǎng)——每日最新資訊28at.com

不啟用虛擬線程

考慮到有 2000 個(gè)線程進(jìn)行壓測(cè),所以將 Tomcat 線程池的最大線程數(shù)也設(shè)置到 2000,如下圖:3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

壓測(cè)結(jié)果如下:3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

3jR28資訊網(wǎng)——每日最新資訊28at.com

可以看到 CPU 占用達(dá)到百分之 170,內(nèi)存占用達(dá)到百分之 35 的情況下,壓測(cè)吞吐量可以達(dá)到 1492。3jR28資訊網(wǎng)——每日最新資訊28at.com

OK,到這里我們可以看到在 Spring Boot 3.2 版本中,使用了虛擬線程的 Tomcat 對(duì)比不用虛擬線程時(shí),吞吐量提升差不多有 20%。3jR28資訊網(wǎng)——每日最新資訊28at.com

在更高并發(fā)的測(cè)試中,這個(gè)差距會(huì)越來越明顯。因?yàn)?Tomcat 使用的平臺(tái)線程過多時(shí),上下文切換開銷會(huì)越來越大,而且虛擬線程比平臺(tái)線程占用更少的內(nèi)存,一個(gè)虛擬線程只占用幾 kb 到幾十 kb 內(nèi)存。可以輕松創(chuàng)建上萬虛擬線程,降低資源占用同時(shí)提高并發(fā)。3jR28資訊網(wǎng)——每日最新資訊28at.com

最后聊兩句

虛擬線程帶給了現(xiàn)代程序員新的編程體驗(yàn),使用阻塞編程也能開發(fā)出高性能應(yīng)用程序,而避免了異步模型的編程復(fù)雜度,隨著更多的框架接入虛擬線程,相信虛擬線程會(huì)在未來大放異彩。3jR28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-37249-0.htmlTomcat 配合虛擬線程,一種新的編程體驗(yàn)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 深入理解Go標(biāo)準(zhǔn)庫-http server的優(yōu)雅關(guān)閉

下一篇: 萬字長(zhǎng)文帶你徹底吃透Spring循環(huán)依賴,堪稱全網(wǎng)最全(文末福利)

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 5月安卓手機(jī)好評(píng)榜:魅族20 Pro奪冠

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來源安兔兔評(píng)測(cè),收集時(shí)間2023年5月1日至5月31日,僅限國內(nèi)市場(chǎng)。第一名:魅族20 Pro好評(píng)率:97.50%不得不感慨魅族老品牌還
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會(huì)帶來以下幾個(gè)問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對(duì)于當(dāng)前線程而言,該線程
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對(duì)帶有指定屬性的 HTML 元素設(shè)置樣式。可以為擁有指定屬性的 HTML 元素設(shè)置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡(jiǎn)單而
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動(dòng)設(shè)備上有一個(gè)固定元素,當(dāng)激活虛擬鍵盤時(shí),該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個(gè)問題、為什么會(huì)發(fā)生
  • 零售大模型“干中學(xué)”,攀爬數(shù)字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對(duì)于絕大多數(shù)登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標(biāo)。攀登珠峰的商業(yè)路線有兩條,一是尼泊爾境內(nèi)的南坡路線,一是中國境內(nèi)的北坡路線。相
  • 騰訊蓋樓,字節(jié)拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之“想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗(yàn)嗎?一起上晶核,即刻暴打!”曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 余承東:AI大模型技術(shù)的發(fā)展將會(huì)帶來下一代智能終端操作系統(tǒng)的智慧體驗(yàn)

    8月4日消息,2023年華為開發(fā)者大會(huì)(HDC.Together)今天正式開幕,華為發(fā)布HarmonyOS 4、全新升級(jí)的鴻蒙開發(fā)套件、HarmonyOS Next開發(fā)者預(yù)覽版本等一系列
  • 華為開發(fā)者大會(huì)2023日程公開:開設(shè)鴻蒙HarmonyOS 4體驗(yàn)區(qū)

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發(fā)者大會(huì) 2023 的詳細(xì)日程。整場(chǎng)大會(huì)將于 8 月 4 日-6 日之間舉行,屆時(shí)將發(fā)布最新一代鴻蒙 H
  • 機(jī)構(gòu)稱Q2全球智能手機(jī)出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據(jù)外媒報(bào)道,研究機(jī)構(gòu)的報(bào)告顯示,由于需求下滑,今年二季度全球智能手機(jī)的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
Top 主站蜘蛛池模板: 朝阳县| 县级市| 内江市| 长顺县| 皋兰县| 吴桥县| 剑川县| 扶余县| 大方县| 同德县| 吉林省| 施秉县| 神农架林区| 苍山县| 望奎县| 乾安县| 德阳市| 思茅市| 旬邑县| 东安县| 贡觉县| 鹤峰县| 乾安县| 安丘市| 楚雄市| 永兴县| 利川市| 天柱县| 营山县| 华坪县| 灵宝市| 山西省| 宁乡县| 孟州市| 长寿区| 太保市| 博爱县| 阿图什市| 布拖县| 呼和浩特市| 南和县|