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

Java19 帶來的虛擬線程是怎樣玩出花提升十倍性能的

開發 前端
虛擬線程的代碼跟上面的代碼十分相似,代碼如下。可以看到,在代碼層面上跟上面唯一的區別就是 Executors.newCachedThreadPool() 這一行變成了 Executors.newVirtualThreadPerTaskExecutor() 即代表創建的虛擬線程。

今天阿粉想跟大家聊的時候 Java19 中提到的虛擬線程 virtual threads。

基本概念

我們都知道 Java 中的線程跟操作系統的內核線程是一對一的,Java 線程的調度其實是依賴操作系統的內核線程的,這就導致了我們的線程切換和運行就需要進行上下文切換以及消耗大量的系統資源,同時我們也知道機器的資源是昂貴的并且也是有限的,我們不能也無法肆無忌憚的創建線程,因此線程往往會成為我們系統的瓶頸。

圖片

為了解決這個問題,Java19 中提出了一種虛擬線程的概念,為了區別,之前的線程被稱為平臺線程。要注意虛擬線程并不是用來直接取代平臺線程的,虛擬線程是建議在平臺線程之上的,一個平臺線程可以對應多個虛擬線程,同時一個平臺線程還是一一對應內核線程,因此上面的架構就變成了如下,一個 VT 代表一個虛擬線程。

圖片

如果有小伙伴對 GO 語言比較熟悉的話,就會想到 Java 中的虛擬線程跟 GO 中的 Goroutines 是很類似的,確實是這樣,所以說語言都是相通的。

舉個栗子

這里我們通過分別使用平臺線程以及虛擬線程來測試一個 case 看看兩者的耗時和性能是怎樣的,測試分如下幾步,我們依次來看一下。注意下面的測試代碼都是在 Java19 的版本中運行的。

平臺線程方式

我們通過 JDK 自帶的線程池 Executors.newCachedThreadPool() 來創建線程池,并執行一定數據任務,任務的數量我們通過入參來控制,方便后續通過主函數調用。

public static void platformThread(int size){
long l = System.currentTimeMillis();
try(var executor = Executors.newCachedThreadPool()) {
IntStream.range(0, size).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
//System.out.println(i);
return i;
});
});
}
System.out.printf("elapsed time: %dms\n", System.currentTimeMillis() - l);
}

虛擬線程的方式

虛擬線程的代碼跟上面的代碼十分相似,代碼如下。可以看到,在代碼層面上跟上面唯一的區別就是 Executors.newCachedThreadPool()  這一行變成了 Executors.newVirtualThreadPerTaskExecutor() 即代表創建的虛擬線程。

public static void virThread(int size){
long l = System.currentTimeMillis();
try(var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, size).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
//System.out.println(i);
return i;
});
});
}
System.out.printf("elapsed time: %dms\n", System.currentTimeMillis() - l);
}

監控運行的線程

上面的兩個方法都是都是創建線程池用來提交任務的,但是位于具體創建了多少個線程我們是不知道的,所以我們還需要通過下面的代碼來監控。

public static void main(String[] args){
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleAtFixedRate(() -> {
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfo = threadBean.dumpAllThreads(false, false);
long count = Arrays.stream(threadInfo).count();
System.out.println(count + " os thread");
}, 1, 1, TimeUnit.SECONDS);

int size = 100000;
// platformThread(size);
virThread(size);
}

通過另一個線程池開啟一個線程信息監控的線程,每秒鐘輸出一次當前的運行線程數。這里注意,如果上面的代碼在 IDEA 中提示報錯,找不到類,如下所示,我們可以將鼠標放上去進行修復。

圖片

也可以手動在設置中的編譯器》Java 編譯器這里給自己的模塊增加一個編譯參數 -parameters --add-modules java.management --enable-preview 。

圖片

運行

上面的三段組合在一起就是一個完整的 case,如果這個時候如果上面的代碼都正常,在運行的時候不出意外會出現下面的錯誤,

圖片

這里是因為當前 Java19 中的虛擬線程特性還處于預覽階段,不能直接使用,我們需要在啟動參數上面配置 --enable-preview 參數,才能正常測試,如下所示,不同版本的 IDEA 可能顯示的位置不一樣,但是都是配置 VM 參數,找一下就好了。

圖片

配置好了過后再次運行就可以得到如下的結果,可以看到在 size 大小為 100000 的情況下,虛擬線程只創建了 12 個平臺線程,并且只在 2523 ms 就完成了整個任務。

圖片

但是當我們運行平臺線程的方法的時候會發現,同樣的 size 的情況下,平臺線程創建了好幾千個,而且還會觸發 OOM,因為操作系統的資源已經被耗盡了,由此可見虛擬線程的性能要遠遠高于平臺線程。YYDS!

圖片

[ ] 為了避免OOM 我們也可以將代碼中的  Executors.newCachedThreadPool() 方法,改成 Executors.newFixedThreadPool(xxx),這樣雖然可以避免大量創建線程導致 OOM,但是任務執行的時長就會消耗更長,阿粉這邊測試在 size 為 10000 的情況下,配置 500 個線程的時候,總共花費了 20276 ms,在數據量小十倍的情況下耗時卻增長十倍。性能可想而知,感興趣的小伙伴可以自己嘗試一下。


圖片


責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-09-07 11:29:36

API開發

2025-05-26 00:02:00

TypeScriptGo 語言前端

2017-09-26 14:56:57

MongoDBLBS服務性能

2023-06-13 13:52:00

Java 7線程池

2025-03-13 11:59:00

2024-06-27 11:22:34

2021-09-13 10:25:35

開發技能代碼

2017-12-06 08:06:47

IBMGPU機器學習

2025-06-05 04:22:00

SQL性能索引

2025-05-26 04:00:00

2009-12-15 21:49:05

2021-04-13 14:25:41

架構運維技術

2023-02-06 07:17:22

2023-02-07 20:17:21

JDK19虛擬線程

2024-03-08 07:58:13

QPShttpsync

2022-10-27 07:09:34

DjangoAPIRedis

2022-09-15 16:59:46

人工智能空調能源

2022-08-30 10:58:45

ViteEsbuild前端

2024-12-06 06:20:00

代碼枚舉

2009-11-19 08:46:16

Windows 7系統驅動
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91av导航 | 中文字幕乱码一区二区三区 | 亚洲精品日本 | 国产欧美一区二区三区日本久久久 | 国产成人精品免费 | 久久伊人一区 | 久久精品小视频 | 久久精品中文 | 国产视频1区 | av毛片| 欧美九九九 | 久久这里只有 | 国产精品亚洲综合 | 一区二区国产精品 | 自拍偷拍中文字幕 | 亚洲视频一区 | 国内精品视频在线 | 2019天天操| 国产在线视频在线观看 | 国产精品色| 一二区视频 | www.青青草 | 一区在线观看视频 | 成人亚洲| 日韩小视频在线 | 欧美电影大全 | 中文在线一区二区 | 日韩久久久久 | 一区二区三区在线播放 | 日日射夜夜骑 | 国产美女久久 | 最新超碰 | 国产精品久久久久久久久久 | 天天躁日日躁狠狠很躁 | 亚洲小视频 | 欧美亚洲国语精品一区二区 | 黑人巨大精品 | 精产国产伦理一二三区 | 毛片区| 成人免费在线电影 | 夜夜爽夜夜操 |