【Java21】在spring boot中使用虛擬線程

文章目錄

  • 0.環境說明
  • 1.原理解析
  • 2.spring boot的方案
  • 3.注意事項(施工中,歡迎補充)

前置知識

  • 虛擬線程VT(Virtual Thread)

0.環境說明

用于驗證的版本:

  • spring boot: 3.3.3
  • jdk: OpenJDK 21.0.5

spring boot 3.1中就支持使用jdk21的虛擬線程了,但是在spring boot 3.2中可以直接通過配置的方式開啟虛擬線程。不過本文編寫的時候spring boot 3.3.3已經GA了,他在3.2的基礎上又對虛擬線程進行了進一步地適配,所以本文章中的版本為3.3

在spring boot 3.2.9中配置spring.threads.virtual.enabled=true即可啟用虛擬線程

1.原理解析

開啟了這個配置后,對我們的spring boot服務有什么影響呢?

我們在spring boot的源碼中搜索spring.threads.virtual.enabled即可看到這個配置在spring boot中生效在了什么地方。
首先我們可以看到如下的代碼(通過代碼注釋也能看出,這個配置就是在3.2.0引入的)

/*** Threading of the application.** @author Moritz Halbritter* @since 3.2.0*/
public enum Threading {/*** Platform threads. Active if virtual threads are not active.*/PLATFORM {@Overridepublic boolean isActive(Environment environment) {return !VIRTUAL.isActive(environment);}},/*** Virtual threads. Active if {@code spring.threads.virtual.enabled} is {@code true}* and running on Java 21 or later.*/VIRTUAL {@Overridepublic boolean isActive(Environment environment) {return environment.getProperty("spring.threads.virtual.enabled", boolean.class, false)&& JavaVersion.getJavaVersion().isEqualOrNewerThan(JavaVersion.TWENTY_ONE);}};/*** Determines whether the threading is active.* @param environment the environment* @return whether the threading is active*/public abstract boolean isActive(Environment environment);}

接下來我們看一下VIRTUAL.isActive(environment)這個方法都用在了哪里(哪里用到了,就說明哪里的虛擬線程是通過這個配置生效的)

可以看到他被用在如下的地方:

  • spring-webflux(區別于spring web的一個響應式web開發框架)的阻塞配置中(如果阻塞了使用什么類型的線程去進行阻塞)
  • 注解ConditionalOnThreading的判斷條件OnThreadingCondition
    • Rabbit MQ——一個消息隊列,啟用虛擬線程則執行configurer.setTaskExecutor(new VirtualThreadTaskExecutor("rabbit-direct-"));configurer.setTaskExecutor(new VirtualThreadTaskExecutor("rabbit-simple-"));
    • JedisConnection——一個redis客戶端,啟用虛擬線程則執行
      	SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("redis-");executor.setVirtualThreads(true);factory.setExecutor(executor);
      
    • LettuceConnection——一個redis客戶端,啟用虛擬線程則執行和Jedis類似的代碼,都是把Executor設置為一個啟用了虛擬線程的new SimpleAsyncTaskExecutor("redis-");
    • Kafka——一個消息隊列,啟用虛擬線程則執行和Jedis類似的兩碼,把Executor設置為一個啟用了虛擬線程的new SimpleAsyncTaskExecutor("kafka-");
    • TaskExecutorConfigurations——spring boot中的任務調度器配置類,@Async(異步任務注解)所注解的方法會根據配置決定是用平臺線程執行還是虛擬線程執行
    • TaskSchedulingConfigurations——spring boot中定時任務配置類,@Scheduled(定時任務注解)所注解的方法會根據配置決定是用平臺線程執行還是虛擬線程執行
    • EmbeddedWebServerFactoryCustomizerAutoConfiguration——通常我們最關心的地方,這里定義了spring web的默認容器tomcat的線程配置(Jetty的工作線程配置也在一起),如果開啟了虛擬線程,則tomcat會使用虛擬線程作為執行器(再也不用考慮tomcat默認200線程的問題了!!!)
  • Pulsar:一個分布式消息流平臺,啟用虛擬線程則執行containerProperties.setConsumerTaskExecutor(new VirtualThreadTaskExecutor("pulsar-consumer-"));readerContainerProperties.setReaderTaskExecutor(new VirtualThreadTaskExecutor("pulsar-reader-"));

2.spring boot的方案

通過在spring boot的源碼搜索@ConditionalOnThreading(Threading.VIRTUAL),可以看到spring boot會根據虛擬線程的開啟與否來選擇注入不同的bean,我們以spring-data-redis為例,其具體代碼如下:

    @Bean@ConditionalOnMissingBean(RedisConnectionFactory.class)@ConditionalOnThreading(Threading.PLATFORM)LettuceConnectionFactory redisConnectionFactory(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,ClientResources clientResources) {return createConnectionFactory(builderCustomizers, clientResources);}@Bean@ConditionalOnMissingBean(RedisConnectionFactory.class)@ConditionalOnThreading(Threading.VIRTUAL)LettuceConnectionFactory redisConnectionFactoryVirtualThreads(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,ClientResources clientResources) {LettuceConnectionFactory factory = createConnectionFactory(builderCustomizers, clientResources);SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("redis-");executor.setVirtualThreads(true);factory.setExecutor(executor);return factory;}

通過代碼不難看出,spring boot 3.2通過@ConditionalOnThreading注解的方式,實現了虛擬線程和平臺線程的動態配置。

如果我們自己需要開發一個能夠同時支持平臺線程和虛擬線程的sdk,可以復用這個注解。

3.注意事項(施工中,歡迎補充)

  • 使用虛擬線程本身要注意的5個點:
    1. 大方使用“一個請求一個線程”的開發方式
    2. 不需要對虛擬線程進行池化
    3. 使用信號量控制并發
    4. 慎用ThreadLocal,使用ScopeValue(java21中還是預覽狀態)代替
    5. 使用ReturnLock替代synchronized(這個問題似乎在jdk23中會永久解決)
  • java21默認的垃圾回收器G1和其自身的JIT編譯器C2似乎有沖突,會導致jvm crash?(這里不能確定,似乎在高版本jdk 21.0.7中進行了修復,但是我比較了openjdk的源碼,并沒能找到具體的改動指向這個問題)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87771.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利器:NPM和YARN及其他

文章目錄**1. 安裝 Yarn&#xff08;推薦方法&#xff09;****2. 驗證安裝****3. 常見問題及解決方法****① 權限不足&#xff08;Error: EPERM&#xff09;****② 網絡問題&#xff08;連接超時或下載失敗&#xff09;****③ 環境變量未正確配置****4. 替代安裝方法&#xff0…

跨平臺直播美顏SDK集成實錄:Android/iOS如何適配貼紙功能

眾所周知&#xff0c;直播平臺與短視頻平臺的貼紙功能不僅是用戶表達個性的方式&#xff0c;更是平臺提高用戶粘性和互動轉化的法寶。 可問題來了&#xff1a;如何讓一個貼紙功能&#xff0c;在Android和iOS兩大平臺上表現一致、運行流暢、加載穩定&#xff1f;這背后&#xff…

JavaWeb(蒼穹外賣)--學習筆記04(前端:HTML,CSS,JavaScript)

前言 本片文章是學習B站黑馬程序員蒼穹外賣的學習筆記。因為最近期末周&#xff0c;一直在應付考試所以就學的很少&#xff0c;恰好視頻中在講Nginx反向代理和負載均衡&#xff08;寫著對前端的內容做一個復習&#xff09; 概述&#xff1a; 1.web前端主要由三部分組成&…

智能學號抽取系統 V5.4.3.2 —— Vue.js 實現的多功能課堂隨機抽簽工具

智能學號抽取系統 V5.4.3.2 —— Vue.js 實現的多功能課堂隨機抽簽工具 在教學或會議場景中&#xff0c;我們經常需要隨機抽取一個或多個學號/編號來決定發言者、答題者或者參與者。為了提高效率和公平性&#xff0c;我們可以使用一些智能化的小工具來實現這一過程。 今天介紹…

從0開始學習R語言--Day39--Spearman 秩相關

在非參數統計中&#xff0c;不看數據的實際數值&#xff0c;單純比較兩組變量的值的排名是通用的基本方法&#xff0c;但在客觀數據中&#xff0c;很多變量的關系都是非線性的&#xff0c;其他的方法不是對樣本數據的大小和線性有要求&#xff0c;就是只能對比數據的差異性&…

WSL - Linux 安裝 Anaconda3-2025.06-0 詳細教程 [WSL 分發版均適用]

一、檢查系統狀態 安裝前先確認 WSL - Linxu 已正常啟動&#xff08;比如 Ubuntu&#xff09;&#xff0c;網絡連接穩定&#xff0c;并且系統磁盤有足夠空間&#xff0c;一般建議預留至少 5GB 以上的可用空間&#xff0c;避免因空間不足導致安裝失敗。 二、下載安裝包 Anacond…

熱血三國建筑攻略表格

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>熱血三國建筑攻略表格</title><style>…

SpringBoot+MySQL醫院掛號系統源碼

概述 基于SpringBootMySQL開發的醫院掛號系統完整源碼&#xff0c;該系統功能完善&#xff0c;包含從患者掛號到醫生管理的全流程解決方案&#xff0c;采用主流技術棧開發&#xff0c;代碼規范易于二次開發。 主要內容 系統包含完整的前后臺功能模塊&#xff1a; ??前臺功…

Linux系統之MySQL數據庫基礎

目錄 一、概述 數據庫概念 數據庫的類型 關系型數據庫模型 關系數據庫相關概念 二、安裝 1、mariadb安裝 2、mysql安裝 3、啟動并開機自啟 4、本地連接&#xff08;本地登錄&#xff09; 三、mysqld數據庫配置與命令 yum安裝后生成的目錄 mysqld服務器的啟動腳本 …

MySQL--InnoDB存儲引擎--頁結構

目錄 一、頁的大小 二、頁的分類 三、頁頭和頁尾 3.1 頁頭--File Header 3.2 頁尾--File Trailer 3.3 LSN 四、數據行 五、頁中數據的查詢 六、事務和索引在頁中的記錄 一、頁的大小 前面介紹了每個數據頁默認大小為16KB&#xff0c;是操作系統“數據塊” 4KB 的整數倍…

卡車檢測數據集-700張圖片交通運輸管理 智能監控系統 道路安全監測

跌倒檢測數據集-4500張圖片&#x1f4e6; 已發布目標檢測數據集合集&#xff08;持續更新&#xff09;&#x1f69b; Deteccin de carpa 2 Computer Vision Project&#x1f4cc; 數據集概覽包含類別&#x1f3af; 應用場景&#x1f5bc; 數據樣本展示&#x1f527; 使用建議&a…

Python爬蟲實戰:研究pangu庫相關技術

1. 引言 1.1 研究背景與意義 在數字化信息傳播時代,中文文本排版質量直接影響信息傳達效果。規范的排版要求中文與西文、數字間保持合理空格間距,但人工處理不僅效率低,且易出現一致性問題。隨著互聯網中文內容爆發式增長,傳統人工排版已無法滿足需求。Python 作為高效的…

day48-考試系統項目集群部署

1. ?考試系統項目集群架構圖負載均衡說明7層負載通過nginx對http請求進行轉發&#xff08;uri,ua,類型&#xff09;4層負載對端口負載均衡&#xff08;后端&#xff09;2. &#x1f4dd;環境準備角色主機ip負載均衡lb01/lb02172.16.1.5/172.16.1.6前端web集群web01/web02172.1…

Redis+Caffeine雙層緩存策略對比與實踐指南

RedisCaffeine雙層緩存策略對比與實踐指南在高并發場景下&#xff0c;緩存是提升系統性能和并發處理能力的關鍵手段。常見的緩存方案包括遠程緩存&#xff08;如Redis&#xff09;和本地緩存&#xff08;如Caffeine&#xff09;。單層緩存各有優劣&#xff0c;結合兩者優勢的雙…

FastAPI+React19 ERP系統實戰 第02期

一、搭建環境 1.1 創建Python虛擬環境 切換Python版本: pyenv local 3.12創建虛擬環境: python -m venv venv激活虛擬環境: venv\Scripts\activate1.2 安裝FastAPI項目依賴 requirements.txt fastapi==0.109.1

百度AI文心大模型4.5系列開源模型評測,從安裝部署到應用體驗

2025年6月30日&#xff0c;百度突然宣布&#xff0c;將旗下最新的大語言模型文心大模型4.5&#xff08;ERNIE 4.5&#xff09;全系列開源&#xff0c;震動整個AI行業。百度在GitCode平臺上開源了文心大模型4.5系列&#xff0c;包括ERNIE-4.5-VL-424B-A47B-Base-PT等多個型號。此…

windows安裝maven環境

在maven官網下載安裝包 https://maven.apache.org/download.cgi 下載完成后安裝maven&#xff0c;一般下載編輯好的 創建個maven目錄解壓出來即可 配置環境變量 根據剛剛的安裝路徑&#xff0c;新建一個命名為MAVEN_HOME的系統變量 新建完成點開系統變量的Path項&#xff0c;…

MySQL(117)何進行數據庫安全加密?

數據庫安全加密是保護敏感數據免受未授權訪問的重要手段。以下是一個詳細深入的步驟&#xff0c;介紹如何進行數據庫安全加密&#xff0c;包括數據傳輸加密和數據存儲加密。 一. 數據傳輸加密 確保數據在傳輸過程中被加密&#xff0c;以防止中間人攻擊。我們以MySQL為例&#x…

工程化實踐——標準化Eslint、PrettierTS

前端工程化中的標準化工具&#xff08;如Prettier、ESLint、Husky等&#xff09;雖然大幅提升了開發效率和代碼質量&#xff0c;但在實際使用中也存在一些限制和挑戰。以下從工具特性、團隊協作、開發體驗等維度詳細分析常見限制&#xff0c;并以Prettier為核心舉例說明&#x…

應急響應靶場——web3 ——知攻善防實驗室

前景需要&#xff1a; 小苕在省護值守中&#xff0c;在靈機一動情況下把設備停掉了&#xff0c;甲方問&#xff1a;為什么要停設備&#xff1f;小苕說&#xff1a;我第六感告訴我&#xff0c;這機器可能被黑了。這是他的服務器&#xff0c;請你找出以下內容作為通關條件&#…