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

虛擬線程在Spring Boot中的應用及性能對比

開發 前端
虛擬線程由Project Loom引入,并在Java 19中作為預覽功能提供,并且在成為官方JDK 21版本的一部分。此外,Spring 6版本集成了這一強大功能,允許開發者進行嘗試。

環境:Spring Boot3.2.5

1. 簡介

在本篇文章中,我們將學習如何在Spring Boot應用程序中利用虛擬線程的強大功能。

虛擬線程由Project Loom引入,并在Java 19中作為預覽功能提供,并且在成為官方JDK 21版本的一部分。此外,Spring 6版本集成了這一強大功能,允許開發者進行嘗試。

首先,我們將了解“平臺線程”與“虛擬線程”之間的主要區別。接下來,我們將從頭開始構建一個使用虛擬線程的Spring Boot應用程序。最后,我們將創建一個小型測試,以檢查簡單Web應用的吞吐量是否有所提升。

虛擬線程 VS. 平臺線程

主要區別在于,虛擬線程在運行周期內不依賴操作系統線程。虛擬線程與硬件解耦,因此稱為 "虛擬"。此外,JVM 提供的抽象層賦予了這種解耦。

在本文中,我們要驗證虛擬線程的運行成本遠低于平臺線程。我們要確認,創建數百萬個虛擬線程不會出現內存不足錯誤(平臺線程容易出現此問題)。

關于虛擬線程的詳細介紹,可查看下面這篇文章

提升系統吞吐量,詳解JDK21虛擬線程,炸裂

2. 實戰案例

2.1 開啟虛擬線程支持

從 Spring Boot 3.2 開始,如果我們使用 Java 21,啟用虛擬線程非常簡單。我們將 spring.threads.virtual.enabled 屬性設置為 true,然后就可以開始了:

spring:
  threads:
    virtual:
      enabled: true

理論上,我們不需要做其他任何事情。但是,從普通線程切換到虛擬線程可能會給傳統應用程序帶來不可預見的后果。因此,我們必須對應用程序進行全面測試。

2.2 驗證虛擬線程

通過上面開啟虛擬線程后,我們通過如下方式是否正確的開啟了虛擬線程。

@GetMapping("name")
public String toThread() {
  return Thread.currentThread().toString() ;
}

這里我們打印當前處理請求的線程名稱,輸出結果:

圖片圖片

響應結果明確指出我們正在使用虛擬線程處理此網絡請求。換句話說,Thread.currentThread() 調用返回了 VirtualThread 類的一個實例。

2.3 性能對比

為了比較性能,我們將使用 JMeter 運行負載測試。這并不是一個完整的性能比較,而是一個起點,我們可以從這個起點出發,用不同的參數建立更多的測試。

在這個特定場景中,我們將通過Controller接口進行測試,該接口只需讓執行進入休眠狀態一秒鐘,模擬一個復雜的異步任務:

@RestController
@RequestMapping("/load")
public class LoadTestController {


  private static final Logger logger = LoggerFactory.getLogger(LoadTestController.class) ;


  @GetMapping
  public void test() throws InterruptedException {
      logger.info("日志信息...") ;
      // 模擬耗時操作
      Thread.sleep(1000) ;
  }
}

接下來,在JMeter中創建一個線程組,模擬 1000 個并發用戶在 100 秒內訪問 /load 接口:

圖片圖片

在這種情況下,采用這項新功能所帶來的性能提升是顯而易見的。讓我們比較一下不同實現的 "響應時間圖"。這是標準線程的響應時間圖。我們可以看到,完成一次調用所需的時間很快就達到了 5000 毫秒:

圖片圖片

這種情況發生是因為平臺線程是一種有限資源。當所有計劃的和池中的線程都在忙碌時,Spring 應用程序只能等待,直到有一個線程空閑下來,才能處理該請求。

接下來,使用虛擬線程進行測試

圖片圖片

生成的圖表顯示,響應時間穩定在1000毫秒。因此,從資源消耗的角度來看,虛擬線程非常高效,請求發出后會立即創建并使用它們。

這種性能提升僅在像我們的演示示例這樣的簡單場景中才可能實現。實際上,對于CPU密集型操作,虛擬線程并不合適,因為這類任務需要極少的阻塞。

下面,我們在通過一個需要CPU大量計算的操作進行測試,測試代碼如下:

// 該示例計算大數的階乘
@GetMapping("calc")
public String calc() {
  // 取值越大計算耗時就越高
  int number = 20000 ;
  // 開始時間
  long startTime = System.currentTimeMillis();
  System.out.println("開始時間: " + new Date(startTime));
  // 執行耗時計算
  factorial(number);
  // 結束時間
  long endTime = System.currentTimeMillis();
  System.out.println("結束時間: " + new Date(endTime));
  // 計算總耗時
  long duration = (endTime - startTime);
  return "計算" + number + "! 耗時: " + duration + " 毫秒" ;
}
private static BigInteger factorial(int n) {
  BigInteger result = BigInteger.ONE;
  for (int i = 1; i <= n; i++) {
    result = result.multiply(BigInteger.valueOf(i));
  }
  return result;
}

首先,是平臺線程測試結果如下:

圖片圖片

圖片

如下,是虛擬線程測試結果

圖片圖片

圖片

根據這里的測試結果,發現他們的結果差不多。但虛擬線程似乎更加平穩吧。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2011-08-25 17:29:40

LUAPHPWEB

2024-01-10 09:59:19

虛擬線程信息

2012-08-06 13:37:35

瀏覽器WindowsUbuntu

2023-11-27 00:46:39

裸機虛擬機

2024-01-31 08:26:44

2013-11-08 10:59:17

Hadoop虛擬化VMware vSph

2014-06-05 10:22:06

Tomcat 7

2012-07-13 10:57:46

Nginxlua

2022-01-10 09:33:59

Firefox 95Chrome 97 Linux

2011-12-14 11:38:42

PhoneGapJavaAndroid

2024-09-30 11:51:07

2020-11-08 14:43:25

Python列表去重編程

2024-11-29 12:58:13

2023-11-06 18:37:23

虛擬線程編寫

2021-01-28 11:17:49

Python爬蟲單線程

2018-03-01 15:20:59

iOS開發多線程

2022-12-05 17:01:20

MySQL數據庫Oracle

2017-04-13 15:15:17

Netflix ZuuNginx性能

2024-10-09 11:31:51

2019-12-25 09:53:01

虛擬機技術固態硬盤
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久一区二区三区 | 色婷婷亚洲一区二区三区 | 国产伦精品一区二区三区四区视频 | 国产一区二区三区不卡av | 成人在线免费电影 | 日韩电影中文字幕在线观看 | 欧美精品一 | 久久久成人动漫 | 色婷婷激情综合 | 亚洲啊v在线 | 日本一道本 | 欧美中文字幕一区二区三区亚洲 | 久久综合伊人一区二区三 | 中文字幕免费在线观看 | 国产精品一区二区在线 | 两性午夜视频 | 久久成人久久 | 91欧美激情一区二区三区成人 | 国产日韩一区二区 | 国产高清视频在线观看播放 | 中文字幕一区二区三区乱码图片 | www日本在线播放 | www.亚洲一区二区三区 | 九九色综合 | 国产精彩视频一区 | 最新国产视频 | 在线一区二区观看 | 成人黄色av | 欧美久久免费观看 | 国产精品一区二区在线 | 亚洲一区精品在线 | 欧洲亚洲一区二区三区 | 日韩中文久久 | 久久精品国产亚洲夜色av网站 | 日韩久久综合 | 日韩三级一区 | 色婷婷综合久久久中字幕精品久久 | 亚洲精品一二三 | 久久精品久久精品 | 懂色tv| 久久九九网站 |