欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot實現虛擬線程的方案

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

什么是虛擬線程

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

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

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

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

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

SpringBoot使用虛擬線程

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

配置

首先我們使用的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 {

    @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)調用這個方法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倍的性能差距??!

HTTP請求性能對比

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

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

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

「普通線程:」

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

「虛擬線程耗時:」

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

總結

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

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

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

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

相關文章

  • Spring+Vue整合UEditor富文本實現圖片附件上傳的方法

    Spring+Vue整合UEditor富文本實現圖片附件上傳的方法

    這篇文章主要介紹了Spring+Vue整合UEditor富文本實現圖片附件上傳的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • 微信公眾號測試賬號自定義菜單的實例代碼

    微信公眾號測試賬號自定義菜單的實例代碼

    這篇文章主要介紹了微信公眾號測試賬號自定義菜單的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • SpringMVC+EasyUI實現頁面左側導航菜單功能

    SpringMVC+EasyUI實現頁面左側導航菜單功能

    這篇文章主要介紹了SpringMVC+EasyUI實現頁面左側導航菜單功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Java多線程的sleep休眠的實現

    Java多線程的sleep休眠的實現

    本文主要介紹了Java多線程的sleep休眠的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java基礎之Thymeleaf的簡單使用

    Java基礎之Thymeleaf的簡單使用

    這篇文章主要介紹了Java基礎之Thymeleaf的簡單使用,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java 設計模式之適配器模式的詳解

    java 設計模式之適配器模式的詳解

    這篇文章主要介紹了java 設計模式之適配器模式的詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • Java8新特性Optional類處理空值判斷回避空指針異常應用

    Java8新特性Optional類處理空值判斷回避空指針異常應用

    這篇文章主要介紹了Java8新特性Optional類處理空值判斷回避空指針異常應用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • springboot實現啟動直接訪問項目地址

    springboot實現啟動直接訪問項目地址

    這篇文章主要介紹了springboot實現啟動直接訪問項目地址,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java日志打印的完全使用指南

    java日志打印的完全使用指南

    日志就是記錄程序的運行軌跡,方便查找關鍵信息,也方便快速定位解決問題,下面這篇文章主要給大家介紹了關于java日志打印使用的相關資料,需要的朋友可以參考下
    2022-01-01
  • Java數據結構之查找

    Java數據結構之查找

    本文主要介紹了Java數據結構中查找的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03

最新評論