最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實現(xiàn)虛擬線程的方案

 更新時間:2025年08月05日 11:10:14   作者:mb685cd9eedee4c  
Java19引入虛擬線程,本文就來介紹一下SpringBoot實現(xiàn)虛擬線程的方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

什么是虛擬線程

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

虛擬線程和普通線程的區(qū)別

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

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

其實如果有用過akka的朋友們會發(fā)現(xiàn),其實兩者很相似,只不過使用akka是應(yīng)用程序來處理,而虛擬線程是JVM來處理,使用上更簡潔且方便。

SpringBoot使用虛擬線程

下面我們會在SpringBoot中使用虛擬線程,將默認(rèn)的異步線程池和http處理線程池替換為虛擬線程,然后對比虛擬線程和普通線程的性能差異,你會發(fā)現(xiàn)差別就像馬車換高鐵,不是一個時代的東西。

配置

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

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

/**
 * 配置是用于稍后測試,spring.virtual-thread=true是使用虛擬線程,false時還是使用默認(rèn)的普通線程
 */
@Configuration
@ConditionalOnProperty(prefix = "spring", name = "virtual-thread", havingValue = "true")
public class ThreadConfig {

    @Bean
    public AsyncTaskExecutor applicationTaskExecutor() {
        return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
    }

    @Bean
    public TomcatProtocolHandlerCustomizer<?> protocolHandlerCustomizer() {
        return protocolHandler -> {
            protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
        };
    }
}

@Async性能對比

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

@Service
public class AsyncService {

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

最后測試類,很簡單,就是循環(huán)調(diào)用這個方法10萬次,計算所有方法執(zhí)行完成的消耗的時間:

@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秒!!

朋友們,接近200倍的性能差距?。?/p>

HTTP請求性能對比

讓我們再看看http請求的對比,簡單寫個get請求,里面什么也不做,一樣睡50ms,模擬IO操作:

@RequestMapping("/get")
public Object get() throws Exception {
    Thread.sleep(50);
    return "ok";
}

然后我們使用jmeter請求接口,500個并發(fā)線程,運(yùn)行1萬次,看看效果如何:

「普通線程:」

可以看到最小用時50ms,這個沒毛病,接口里面睡眠了50ms,但是不管是中位數(shù)還是90/95/99線都大于150ms了,這是因為系統(tǒng)線程是一個很昂貴的資源,SpringBoot中tomcat默認(rèn)的最大連接數(shù)應(yīng)該是200,在連接池的線程被耗盡后,這200個線程在那干等50ms結(jié)束,而剩下的請求也只能等待,無法進(jìn)行其它的操作。下面再看下虛擬線程的表現(xiàn):

「虛擬線程耗時:」

可以看到即使是最大耗時,也保持在100ms以下,即線程等待時間顯著的減少,虛擬線程更好的利用了系統(tǒng)資源。

總結(jié)

從上面的性能對比來看,虛擬線程在性能方面有明顯的優(yōu)勢,但是要注意的是,我們上面的測試都是讓線程等待了50ms,這是模擬什么場景?

沒錯,是IO密集型場景,即線程大部分時間是在等待IO,這樣虛擬線程才可以發(fā)揮出它的優(yōu)勢,如果是CPU密集型場景,那么可能效果并不大。不過我們目前大部分的應(yīng)用都是IO密集型應(yīng)用較多,比如典型的WEB應(yīng)用,大量的時間在等待網(wǎng)絡(luò)IO(DB、緩存、HTTP等等),使用虛擬線程的效果還是非常明顯的。

最后:大部分的公司可能還在用Java8,但是我想說的是,是時候升級了,跟上時代的腳步吧,朋友們!

到此這篇關(guān)于SpringBoot實現(xiàn)虛擬線程的方法步驟的文章就介紹到這了,更多相關(guān)SpringBoot 虛擬線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot lua檢查redis庫存的實現(xiàn)示例

    springboot lua檢查redis庫存的實現(xiàn)示例

    本文主要介紹了springboot lua檢查redis庫存的實現(xiàn)示例,為了優(yōu)化性能,通過Lua腳本實現(xiàn)對多個馬戲場次下的座位等席的庫存余量檢查,感興趣的可以了解一下
    2024-09-09
  • 查找jdk安裝路徑并且切換多版本jdk的詳細(xì)步驟

    查找jdk安裝路徑并且切換多版本jdk的詳細(xì)步驟

    在日常的工作學(xué)習(xí)中可能需要用到不同版本的jdk,下面這篇文章主要給大家介紹了關(guān)于查找jdk安裝路徑并且切換多版本jdk的詳細(xì)步驟,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 詳解Spring中Bean的作用域與生命周期

    詳解Spring中Bean的作用域與生命周期

    Spring作為當(dāng)前Java最流行、最強(qiáng)大的輕量級框架,受到了程序員的熱烈歡迎。準(zhǔn)確的了解Spring?Bean的作用域與生命周期是非常必要的。這篇文章將問你詳解一下Bean的作用域與生命周期,需要的可以參考一下
    2021-12-12
  • Java中的異步操作CompletableFuture示例詳解

    Java中的異步操作CompletableFuture示例詳解

    CompletableFuture是Java8引入的異步編程工具,支持非阻塞的鏈?zhǔn)秸{(diào)用和組合操作,提供了強(qiáng)大的異步任務(wù)編排能力,本文通過實例代碼講解Java中的異步操作CompletableFuture,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • 深入解析SpringBoot自動配置原理

    深入解析SpringBoot自動配置原理

    這篇文章主要介紹了深入解析SpringBoot自動配置原理,SpringBoot?的一大好處就是:大大簡化了?Spring?和其他框架的整合配置,為了簡化配置文件使開發(fā)者更專注于業(yè)務(wù)編碼,可以使用?SpringBoot?來進(jìn)行?Web?開發(fā),需要的朋友可以參考下
    2023-11-11
  • java實現(xiàn)RTF文件查看器(附帶源碼)

    java實現(xiàn)RTF文件查看器(附帶源碼)

    這篇文章主要介紹了一個基于?Java?Swing?的?RTF?文件查看器,既可作為輕量級桌面應(yīng)用,也可嵌入到更大規(guī)模的管理系統(tǒng)中,滿足用戶對?RTF?文檔的即時預(yù)覽、樣式保真和簡單導(dǎo)航需求
    2025-06-06
  • 解析Java按值傳遞還是按引用傳遞

    解析Java按值傳遞還是按引用傳遞

    這篇文章主要介紹了解析Java按值傳遞還是按引用傳遞,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Mybatis框架搭建與簡單查詢詳解

    Mybatis框架搭建與簡單查詢詳解

    本文主要介紹了Mybatis框架搭建與簡單查詢的相關(guān)知識,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java(TM) Platform SE binary 打開jar文件的操作

    Java(TM) Platform SE binary 打開jar文件的操作

    這篇文章主要介紹了Java(TM) Platform SE binary 打開jar文件的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Ribbon從入門到精通實戰(zhàn)案例演示

    Ribbon從入門到精通實戰(zhàn)案例演示

    Ribbon是Netflix開源的客戶端負(fù)載均衡工具,用于微服務(wù)通信,動態(tài)獲取服務(wù)實例并應(yīng)用輪詢、隨機(jī)、權(quán)重響應(yīng)時間等策略,下面通過實戰(zhàn)案例給大家解析Ribbon的核心組件與工作原理,感興趣的朋友一起看看吧
    2025-08-08

最新評論

南充市| 女性| 双流县| 民县| 临沧市| 周宁县| 都昌县| 大名县| 屯留县| 新蔡县| 油尖旺区| 景泰县| 明光市| 湾仔区| 阿拉善左旗| 永吉县| 堆龙德庆县| 大新县| 昔阳县| 白城市| 奇台县| 连云港市| 宣汉县| 雷山县| 抚顺市| 平潭县| 洛南县| 吉木萨尔县| 永兴县| 衡阳市| 新昌县| 云阳县| 安岳县| 岑溪市| 清远市| 渑池县| 德江县| 东源县| 府谷县| 丽江市| 兴业县|