成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

虛擬線程的引入標(biāo)志著 Java 在現(xiàn)代編程世界中對編寫高吞吐量、高并發(fā)應(yīng)用程序提供了更加完美的支持。

本文我就帶著大家一起深入了解一波 Tomcat 配合虛擬線程會(huì)帶來怎樣的效果以及虛擬線程對以后使用 Java 開發(fā)高吞吐量、高并發(fā)應(yīng)用程序時(shí)所帶來的改變。

本文大綱如下:

Tomcat 使用虛擬線程

啟用虛擬線程

在 Spring Boot 3.2 中,使用 Tomcat 作為 web 容器時(shí),啟用虛擬線程只需要將 spring.threads.virtual.enabled 屬性設(shè)置為 true。

這樣 Spinrg Boot 在啟動(dòng) Tomcat 容器時(shí)會(huì)使用一個(gè)虛擬線程執(zhí)行器來代表原有的平臺(tái)線程池。

注意這里是虛擬線程執(zhí)行器,不是虛擬線程池哦。

源碼解析

在 Spring Boot 3.2 版本以前,Tomcat 默認(rèn)的線程池使用的就是 Java 提供的 ThreadPoolExecutor 線程池,在 3.2 版本以后,Spring Boot 修改了創(chuàng)建線程池的方法如下所以。

Tomcat使用何種執(zhí)行器:

是否使用虛擬線程執(zhí)行器:

可以看到 Tomcat 會(huì)先判斷是否啟用了虛擬線程,啟用了的話就直接創(chuàng)建一個(gè)虛擬線程執(zhí)行器 VirtualThreadExecutor。

VirtualThreadExecutor 類是 Tomcat 為了使用虛擬線程作為執(zhí)行器而新增的。他的內(nèi)部代碼中針對每個(gè)請求任務(wù)都是依賴 Jre21Compat 類處理的。

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

VirtualThreadExecutor類源碼:

Jre21Compat類源碼:

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

Spring Boot 3.2 中是通過 tomcatVirtualThreadsProtocolHandlerCustomizer 方法來兼容虛擬線程啟用邏輯的,@ConditionalOnThreading(Threading.VIRTUAL) 條件用判斷 spring.threads.virtual.enabled 屬性是否啟用。代碼如下,

根據(jù)spring.threads.virtual.enabled屬性決定是否啟用虛擬線程:

讀取spring.threads.virtual.enabled屬性:

到這里其實(shí)本文所需要講的涉及源碼的部分就全部講完了。可以看到 Tomcat 引入虛擬線程并不復(fù)雜,引入后不在需要維護(hù)線程池,減輕了執(zhí)行器的復(fù)雜度。

虛擬線程帶來的改變

不知道大家注意到源碼中一個(gè)改變沒有,就是在 Spring Boot 3.2 中,啟用了虛擬線程后,Tomcat 默認(rèn)使用的虛擬線程執(zhí)行器不在需要池化。

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

對于 Tomcat 來說,引入虛擬線程,不必在為線程池的維護(hù)而費(fèi)心,還能減輕編程的復(fù)雜度。

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

就算請求任務(wù)在虛擬線程中調(diào)用阻塞 I/O 操作,導(dǎo)致運(yùn)行時(shí)虛擬線程被掛起阻塞,但是只要掛起結(jié)束后該虛擬線程就可以恢復(fù)。

使用了虛擬線程后,程序員使用普通的阻塞 API,也可以讓程序?qū)τ布睦眠_(dá)到近乎完美水平,以此提供高水平的并發(fā)性,從而實(shí)現(xiàn)高吞吐量。

可以說,虛擬線程的引入,以后程序員就算是使用 Java 中阻塞 API 也可以開發(fā)出高性能、高吞吐量的應(yīng)用程序。

jmter 實(shí)測

在本文中,我還將給各位展示一波 newbeepro 項(xiàng)目升級(jí)到 Spring Boot 3.2 后啟用虛擬線程所帶來的性能提升。

測試服務(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 帶寬

測試平臺(tái)配置

測試項(xiàng)目

newbee-mall-pro 是 newbee-mall 商城的 pro 版本實(shí)現(xiàn)了推薦算法、商品秒殺、優(yōu)惠卷使用,滑塊驗(yàn)證碼,支付寶支付,中文分詞檢索等高級(jí)功能。

項(xiàng)目地址:https://github.com/wayn111/newbee-mall-pro

測試方法

使用 newbee-mall-pro 作為測試項(xiàng)目將啟用虛擬線程以及未啟用虛擬線程的兩次設(shè)置部署到測試服務(wù)器上。

啟動(dòng)容器:amazoncorretto:21.0.1

啟動(dòng)參數(shù):java -jar -Xms1024m -Xmx1024m /opt/newbeemall/newbee-mall.jar

部署后測試地址:http://62.234.206.94/newbeemall/index

測試接口為秒殺接口:/newbeemall/seckill/2/c81e728d9d4c2f636f067f89cc14862c/executionFour

壓測設(shè)置:啟用 2000 個(gè)線程,每個(gè)線程循環(huán)執(zhí)行 30 秒左右。一共測試五輪,先預(yù)熱 JVM 后,取吞吐量最大值。

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

啟用虛擬線程

壓測結(jié)果如下,

可以看到 CPU 占用達(dá)到百分之 142,內(nèi)存占用達(dá)到百分之 35 的情況下,壓測吞吐量最大可以達(dá)到 1731。

不啟用虛擬線程

考慮到有 2000 個(gè)線程進(jìn)行壓測,所以將 Tomcat 線程池的最大線程數(shù)也設(shè)置到 2000,如下圖:

壓測結(jié)果如下:

可以看到 CPU 占用達(dá)到百分之 170,內(nèi)存占用達(dá)到百分之 35 的情況下,壓測吞吐量可以達(dá)到 1492。

OK,到這里我們可以看到在 Spring Boot 3.2 版本中,使用了虛擬線程的 Tomcat 對比不用虛擬線程時(shí),吞吐量提升差不多有 20%。

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

最后聊兩句

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

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2013-03-12 14:07:06

Java編程

2012-10-12 09:32:14

開源云開源云技術(shù)云標(biāo)準(zhǔn)

2021-11-04 17:48:44

編程游戲代碼

2011-07-21 14:17:15

Ceylon

2018-12-14 14:30:12

安全檢測布式系測試

2022-11-22 11:18:38

Java虛擬線程

2023-07-18 18:10:04

2025-01-15 12:00:00

Java線程編程

2024-08-08 08:00:00

2016-01-21 17:49:52

云之家Agora語音會(huì)議

2016-03-03 10:29:31

用戶信息改進(jìn)

2018-03-09 10:09:07

程序媛體驗(yàn)女生

2022-08-08 08:22:22

量子計(jì)算

2017-03-06 14:45:28

戴爾

2010-11-05 10:15:42

云計(jì)算

2015-03-13 11:23:21

編程編程超能力編程能力

2012-07-30 09:58:53

2012-11-01 13:41:25

編程語言BasicPerl

2018-03-06 10:46:42

代碼Python買水果

2010-01-25 15:09:17

C++語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品一区二区三区中文字幕 | 欧美人妇做爰xxxⅹ性高电影 | 免费在线毛片 | 欧美一区二区免费 | 日韩欧美在线免费观看 | 日韩中文字幕久久 | 毛片免费在线 | 自拍偷拍欧美 | 欧美美女爱爱 | 国产精品免费一区二区三区四区 | 亚洲成人免费视频 | 久久人爽 | 亚洲视频在线观看免费 | 亚洲九色| 日韩另类 | 国产高清在线精品一区二区三区 | 一级片免费视频 | 久国久产久精永久网页 | 国产福利在线小视频 | 国产精品永久在线观看 | 日产精品久久久一区二区福利 | 综合网在线 | 欧美三区在线观看 | 日本高清精品 | 红桃视频一区二区三区免费 | 国产精品成人国产乱一区 | 97色伦网 | 一区二区三区欧美 | 精品成人一区二区 | 男女国产视频 | 麻豆91精品91久久久 | 国产欧美视频一区 | 国产中文字幕在线观看 | 91一区| 国产午夜视频 | av在线免费播放 | 亚洲综合色婷婷 | 色婷婷国产精品 | 久久国产日本 | 一级特黄在线 | 国产精品视频一二三区 |