SpringBoot + 虛擬線程,性能炸裂!

一、什么是虛擬線程

虛擬線程是Java19開始增加的一個特性,和Golang的攜程類似,一個其它語言早就提供的、且如此實用且好用的功能,作為一個Java開發者,早就已經望眼欲穿了。

二、虛擬線程和普通線程的區別

“虛擬”線程,望文生義,它是“假”的,它不直接調度操作系統的線程,而是由JVM再提供一層線程的接口抽象,由普通線程調度,即一個普通的操作系統線程可以調度成千上萬個虛擬線程。

虛擬線程比普通線程的消耗要小得多得多,在內存足夠的情況下,我們甚至可以創建上百萬的虛擬線程,這在之前(Java19以前)是不可能的。

三、SpringBoot使用虛擬線程

配置

首先我們使用的Java版本是java-20.0.2-oracle,SpringBoot版本是3.1.2。

要在SpringBoot中使用虛擬線程很簡單,增加如下配置即可:

/*** 配置是用于稍后測試,spring.virtual-thread=true是使用虛擬線程,false時還是使用默認的普通線程*/
@Configuration
@ConditionalOnProperty(prefix = "spring", name = "virtual-thread", havingValue = "true")
public class ThreadConfig {@Beanpublic AsyncTaskExecutor applicationTaskExecutor() {return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());}@Beanpublic TomcatProtocolHandlerCustomizer<?> protocolHandlerCustomizer() {return protocolHandler -> {protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());};}
}

@Async性能對比
我們寫一個異步service,里面睡眠50ms,模擬MySQL或Redis等IO操作:

@Service
public class AsyncService {/*** * @param countDownLatch 用于測試*/@Asyncpublic void doSomething(CountDownLatch countDownLatch) throws InterruptedException {Thread.sleep(50);countDownLatch.countDown();}
}

最后測試類,很簡單,就是循環調用這個方法10萬次,計算所有方法執行完成的消耗的時間:

@Test
public void testAsync() throws InterruptedException {long start = System.currentTimeMillis();int n = 100000;CountDownLatch countDownLatch = new CountDownLatch(n);for (int i = 0; i < n; i++) {asyncService.doSomething(countDownLatch);}countDownLatch.await();long end = System.currentTimeMillis();System.out.println("耗時:" + (end - start) + "ms");
}
普通線程耗時:678秒左右,超過10分鐘了

圖片

虛擬線程耗時:3.9秒!!
在這里插入圖片描述

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

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

相關文章

一些硬件知識(十二)

X電容是接在火線和零線之間&#xff0c;Y電容是接在火零線和地之間。X電容濾除差模干擾&#xff0c;Y電容濾除共模干擾&#xff1a; 高頻干擾信號經過X電容后幅度沒有變化&#xff0c;相位相差180度&#xff1a; DW01電池管理芯片&#xff1a; M1、M2&#xff1a;這兩個為N溝道…

【關于C/C++中的scanf不能使用問題】

方法1&#xff1a;scanf_s 方法2&#xff1a;看見后面的日志了嗎 CRT……&#xff1f;在第一行加上#define 日志 方法3&#xff1a;#pragma warning&#xff08;disable&#xff1a;4996&#xff09; 4996是我們的報錯序號

開發筆記:vue3+ts+vant 卡片數據分頁,下拉加載,卡片左滑可刪除

效果&#xff1a; 實現 使用vantui組件 van-swipe-cell van-card &#xff08;商品卡片&#xff09; 核心代碼 const currentPage ref(1) const pageSize ref(4) const totalSize ref(10) const loading ref(false) const finished ref(false) const refreshing ref(…

Git新倉庫創建流程

平時需要創建新倉庫,老要去查代碼特別煩&#xff0c;在此寫下流程方便備用. 1.創建新的云倉庫 無論使用GitHub還是Gitee,首先要創建一個云倉庫&#xff0c;這里就直接用國內的gitee做演示了&#xff0c;githup老掛加速器太煩&#xff0c;偷個懶. 我這里創建的是一個空倉庫&…

java- Lambda表達式的實際應用

### 12. Lambda 表達式的實際應用 為了更好地理解和應用 Lambda 表達式&#xff0c;我們可以通過一些實際案例來展示其用法和優勢。 #### 12.1 使用 Lambda 表達式進行事件處理 在 GUI 編程中&#xff0c;事件處理是一個常見的任務。使用 Lambda 表達式可以簡化事件處理代碼…

Nginx主配置文件---Nginx.conf

nginx主配置文件的模塊介紹 全局塊&#xff1a; 全局塊是配置文件從開始到 events 塊之間的部分&#xff0c;其中指令的作用域是 Nginx 服務器全局。主要指令包括&#xff1a; user&#xff1a;指定可以運行 Nginx 服務的用戶和用戶組&#xff0c;只能在全局塊配置。例如&…

軟考《信息系統運行管理員》-2.2 信息系統運維的組織

2.2 信息系統運維的組織 信息系統運維的任務 數據資源管理 數據收集、數據校驗、數據錄入、數據處理 軟件資源管理 采購、保存、相關文檔保管、分發、安裝、支持、評價、培訓 硬件資源管理 檢查、維護、故障處理、更新、修復、擴充 系統安全管理 可用性、完整性、保密性、可控…

USB PD+TYPE -C快充電源中MOSFET選型,USB PD應用市場包含智能手機,平板電腦,筆記本電腦,游戲本,移動硬盤,數碼相機,電動工具等傳統領域

USB PD全稱為USB Power Delivery&#xff0c;是由USB-IF組織制定的一種快速充電協議&#xff0c;也是目前市場非常看好的一種協議&#xff0c;可以支持輸出功率高達100W&#xff1b;Type-C是一種接口規范&#xff0c;能夠支持傳輸更大的電流。USB PD應用市場不僅包含智能手機&a…

虛擬紀念展館建設的重大意義:重新定義紀念活動的未來

一、什么是虛擬紀念展館&#xff1f; 虛擬紀念展館是一種利用3D、VR等技術在線展示歷史事件、人物或文化遺產的數字化空間。這些展館通過虛擬現實、增強現實和3D建模等技術手段&#xff0c;創建出身臨其境的體驗&#xff0c;使參觀者可以在互聯網上以互動方式探索和學習。 二、…

【FPGA 學習與實踐】<初階> 項目周計劃

第1-2周&#xff1a;基礎項目 - 4位加法器和計數器 目標&#xff1a;掌握Verilog基本語法和模塊設計。 第1周&#xff1a; 學習Verilog的基本語法和結構&#xff08;模塊、端口、數據類型&#xff09;。設計并實現一個4位加法器。編寫測試平臺&#xff08;Testbench&#xff0…

提升效率就靠它們啦

Hey小伙伴們&#xff5e;&#x1f44b; 知道你們都在忙碌的工作中尋求高效的秘訣&#xff0c;今天就給大家安利五款超實用的國產工作App&#xff0c;讓你的工作生活更加得心應手哦&#xff01;&#x1f4bc;? 1??【億可達】 作為一款自動化工具&#xff0c;億可達被譽為國內…

firewalld(5)--direct

簡介 direct 是 firewalld 服務的一個功能&#xff0c;它允許用戶以更直接的方式配置防火墻規則&#xff0c;繞過通常的 firewalld 區域&#xff08;zone&#xff09;和服務的抽象層。然而&#xff0c;這個功能已經被棄用&#xff08;deprecated&#xff09;&#xff0c;并將…

詳解位運算(、|、^、^、>>、<<)

十六進制與二進制對應關系 十六進制和二進制之間的轉換非常直接&#xff0c;每個十六進制數字直接對應四個二進制位&#xff0c;并且十六進制相對二進制要更加簡潔&#xff0c;因此通常書寫位操作的代碼時會選擇使用十六進制來表示數值。 為了方便快速閱讀涉及位運算的源碼&a…

深入探索Scala的類型推斷機制

引言 Scala是一種靜態類型編程語言&#xff0c;以其強大的類型推斷系統而聞名。類型推斷允許開發者在很多情況下省略顯式的類型聲明&#xff0c;從而編寫更簡潔、更少出錯的代碼。本文將深入探討Scala的類型推斷是如何實現的&#xff0c;以及它如何幫助提高開發效率和代碼可讀…

萌啦跨境工具箱有什么作用,萌啦跨境工具箱OZON營銷神器

萌啦OZON數據平臺&#xff0c;作為專為OZON平臺商家打造的數據分析工具&#xff0c;集成了多種強大功能&#xff0c;旨在幫助商家在激烈的市場競爭中獲得數據驅動的優勢&#xff0c;實現精準運營與高效增長。那么萌啦跨境工具箱有什么作用&#xff1f;接下來介紹萌啦跨境工具箱…

全面升級廚房安全,電焰灶引領新時代

煤氣是許多家庭日常使用的能源&#xff0c;目前的普及率還是比較高的&#xff0c;但平時因煤氣泄漏而引發的事故也很多&#xff0c;只需要查看最近一個月因液化氣泄漏引起的爆炸事件屢見不鮮。打開新聞&#xff0c;我們總能時不時看到煤氣爆炸的事故&#xff0c;幸運的能夠逢兇…

代碼隨想錄算法訓練營day70 | 108. 冗余連接、109. 冗余連接II

本次題目都來自卡碼網 108. 冗余連接 無向圖&#xff0c;返回一條可以刪去的邊&#xff0c;使得結果圖是一個有著N個節點的樹&#xff08;即&#xff1a;只有一個根節點&#xff09;。 從前向后遍歷每一條邊&#xff08;因為優先讓前面的邊連上&#xff09;&#xff0c;邊的…

【2024LLM應用-數據預處理】之如何從PDF,PPT等非結構化數據提取有效信息(結構化數據JSON)?

&#x1f970;大家知道嗎,之前在給AI大模型"喂數據"的時候,我們往往需要把非結構化數據(比如PDF、PPT、Excel等)自己手動轉成結構化的格式,這可真是太累人兒了。&#x1f975; 幸好現在有了Unstructured這個神級庫,它內置的數據提取函數可以幫我們快速高效地完成這個…

ubuntu 安裝并啟用 samba

環境&#xff1a;ubuntu server 24.04 步驟如下&#xff1a; sudo apt update sudo apt install samba修改配置文件&#xff1a; sudo vi /etc/samba/smb.conf新增內容&#xff1a; [username]path /home/[username]available yesvalid users [username]read only nobrow…

[Information Sciences 2023]用于假新聞檢測的相似性感知多模態提示學習

推薦的一個視頻&#xff1a;p-tuning P-tunning直接使用連續空間搜索 做法就是直接將在自然語言中存在的詞直接替換成可以直接訓練的輸入向量。本身的Pretrained LLMs 可以Fine-Tuning也可以不做。 這篇論文也解釋了為什么很少在其他領域結合知識圖譜的原因&#xff1a;就是因…