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

Java終于開始引入虛擬線程(協(xié)程)了

開發(fā) 前端
協(xié)程在Java社區(qū)已經(jīng)呼喚了很久了,現(xiàn)在終于有了實(shí)質(zhì)性的動作,這是一個非常重要的特性。不過這個功能涉及的東西還是很多的,包括平臺線程的兼容性、對ThreadLocal的一些影響、對JUC的影響。

高并發(fā)、多線程一直是Java編程中的難點(diǎn),也是面試題中的要點(diǎn)。Java開發(fā)者也一直在嘗試使用多線程來解決應(yīng)用服務(wù)器的并發(fā)問題。但是多線程并不容易,為此一個新的技術(shù)出現(xiàn)了,這就是虛擬線程。

傳統(tǒng)多線程的痛點(diǎn)

但是編寫多線程代碼是非常不容易的,難以控制的執(zhí)行順序,共享變量的線程安全性,異常可觀察性等等都是多線程編程的難點(diǎn)。

如果每個請求在請求的持續(xù)時間內(nèi)都在一個線程中處理,那么為了提高應(yīng)用程序的吞吐量,線程的數(shù)量必須隨著吞吐量的增長而增長。不幸的是線程是稀缺資源,創(chuàng)建一個線程的代價是昂貴的,即使引入了池化技術(shù)也無法降低新線程的創(chuàng)建成本,而且 JDK 當(dāng)前的線程實(shí)現(xiàn)將應(yīng)用程序的吞吐量限制在遠(yuǎn)低于硬件可以支持的水平。

為此很多開發(fā)人員轉(zhuǎn)向了異步編程,例如CompletableFuture或者現(xiàn)在正熱的反應(yīng)式框架。但是這些技術(shù)要么擺脫不了“回調(diào)地獄”,要么缺乏可觀測性。

解決這些痛點(diǎn)、增強(qiáng)Java平臺的和諧,實(shí)現(xiàn)每個請求使用獨(dú)立線程(thread-per-request style)這種風(fēng)格成為必要之舉。能否實(shí)現(xiàn)一種“成本低廉”的虛擬線程來映射到系統(tǒng)線程以減少對系統(tǒng)線程的直接操作呢?思路應(yīng)該是沒問題的!于是Java社區(qū)發(fā)起了關(guān)于虛擬線程的JEP 425[1]提案。

虛擬線程

虛擬線程(virtual threads)應(yīng)該非常廉價而且可以無需擔(dān)心系統(tǒng)硬件資源被大量創(chuàng)建,并且不應(yīng)該被池化。應(yīng)該為每個應(yīng)用程序任務(wù)創(chuàng)建一個新的虛擬線程。因此,大多數(shù)虛擬線程將是短暫的并且具有淺層調(diào)用堆棧,只執(zhí)行單個 HTTP 客戶端調(diào)用或單個 JDBC 查詢。與之對應(yīng)的平臺線程( Platform Threads,也就是現(xiàn)在傳統(tǒng)的JVM線程 )是重量級且昂貴的,因此通常必須被池化。它們往往壽命長,有很深的調(diào)用堆棧,并且在許多任務(wù)之間共享。

總而言之,虛擬線程保留了與 Java 平臺的設(shè)計相協(xié)調(diào)的、可靠的每請求線程樣式,同時優(yōu)化了硬件的利用。使用虛擬線程不需要學(xué)習(xí)新概念,甚至需要改掉現(xiàn)在操作多線程的習(xí)慣,使用更加容易上手的API、兼容以前的多線程設(shè)計、并且絲毫不會影響代碼的拓展性。

平臺線程和虛擬線程的不同

為了更好理解這一個設(shè)計,草案對這兩種線程進(jìn)行了比較。

現(xiàn)在的線程現(xiàn)在每個java.lang.Thread都是一個平臺線程,平臺線程在底層操作系統(tǒng)線程上運(yùn)行 Java 代碼,并在代碼的整個生命周期內(nèi)捕獲操作系統(tǒng)線程。平臺線程數(shù)受限于 OS 線程數(shù)。

平臺線程

并不會因?yàn)榧尤胩摂M線程而退出歷史舞臺。

未來的虛擬線程

虛擬線程是由 JDK 而不是操作系統(tǒng)提供的線程的輕量級實(shí)現(xiàn)。它們是用戶模式線程的一種形式,在其他多線程語言中已經(jīng)成功(比如Golang中的協(xié)程和Erlang中的進(jìn)程)。虛擬線程采用 M:N 調(diào)度,其中大量 (M) 虛擬線程被調(diào)度為在較少數(shù)量 (N) 的 OS 線程上運(yùn)行。JDK 的虛擬線程調(diào)度程序是一種ForkJoinPool工作竊取的機(jī)制,以 FIFO 模式運(yùn)行。

我們可以很隨意地創(chuàng)建10000個虛擬線程:

// 預(yù)覽代碼
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
});
});
}

無需擔(dān)心硬件資源是否扛得住,反過來如果你使用Executors.newCachedThreadPool()創(chuàng)建10000個平臺線程,在大多數(shù)操作系統(tǒng)上很容易因資源不足而崩潰。

為吞吐量而設(shè)計

但是這里依然要說明一點(diǎn),虛擬線程并非為了提升執(zhí)行速度而設(shè)計。它并不比平臺線程速度快,它們的存在是為了提供規(guī)模(更高的吞吐量),而不是速度(更低的延遲)。它們的數(shù)量可能比平臺線程多得多,因此根據(jù)利特爾定律,它們可以實(shí)現(xiàn)更高吞吐量所需的更高并發(fā)性。

換句話說,虛擬線程可以顯著提高應(yīng)用程序吞吐量

  • 并發(fā)任務(wù)的數(shù)量很高(超過幾千個),并且
  • 工作負(fù)載不受 CPU 限制,因?yàn)樵谶@種情況下,擁有比處理器內(nèi)核多得多的線程并不能提高吞吐量。

虛擬線程有助于提高傳統(tǒng)服務(wù)器應(yīng)用程序的吞吐量,正是因?yàn)榇祟悜?yīng)用程序包含大量并發(fā)任務(wù),這些任務(wù)花費(fèi)大量的時間等待。

增強(qiáng)可觀測性

編寫清晰的代碼并不是全部。對正在運(yùn)行的程序狀態(tài)的清晰表示對于故障排除、維護(hù)和優(yōu)化也很重要,JDK 長期以來一直提供調(diào)試、分析和監(jiān)視線程的機(jī)制。在虛擬線程中也會增強(qiáng)代碼的可觀測性,讓開發(fā)人員更好地調(diào)試代碼。

新的線程API

為此增加了新的線程API設(shè)計,目前放出的部分如下:

  • Thread.Builder 線程構(gòu)建器。
  • ThreadFactory 能批量構(gòu)建相同特性的線程工廠。
  • Thread.ofVirtual() 創(chuàng)建一個虛擬線程。
  • Thread.ofPlatform() 創(chuàng)建一個平臺線程。
  • Thread.startVirtualThread(Runnable) 一種創(chuàng)建然后啟動虛擬線程的便捷方式。
  • Thread.isVirtual() 測試線程是否是虛擬線程。

還有很多就不一一演示了,有興趣的自行去看JEP425。

總結(jié)

協(xié)程在Java社區(qū)已經(jīng)呼喚了很久了,現(xiàn)在終于有了實(shí)質(zhì)性的動作,這是一個非常重要的特性。不過這個功能涉及的東西還是很多的,包括平臺線程的兼容性、對ThreadLocal的一些影響、對JUC的影響。可能需要多次預(yù)覽才能最終落地,不過這已經(jīng)是很大的進(jìn)步了,起碼距離實(shí)裝已經(jīng)不遠(yuǎn)了,胖哥可能趕不上那個時候了,不過很多年輕的同學(xué)應(yīng)該能夠趕上。

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2025-06-05 01:22:00

線程虛擬內(nèi)存系統(tǒng)

2025-05-26 02:20:00

并發(fā)協(xié)程虛擬內(nèi)存

2023-10-11 07:39:58

Java虛擬線程

2023-04-26 01:12:53

進(jìn)程線程語言

2025-06-26 04:10:00

2020-11-29 17:03:08

進(jìn)程線程協(xié)程

2021-09-16 09:59:13

PythonJavaScript代碼

2021-04-25 09:36:20

Go協(xié)程線程

2023-10-12 09:46:00

并發(fā)模型線程

2020-04-07 11:10:30

Python數(shù)據(jù)線程

2020-08-04 10:56:09

進(jìn)程線程協(xié)程

2020-02-24 10:39:55

Python函數(shù)線程池

2023-11-17 11:36:59

協(xié)程纖程操作系統(tǒng)

2022-09-01 17:08:38

DebianLinux

2022-07-27 10:34:29

GoogleC++系統(tǒng)

2023-10-24 19:37:34

協(xié)程Java

2021-12-09 06:41:56

Python協(xié)程多并發(fā)

2025-02-08 09:13:40

2021-06-04 14:28:07

協(xié)程線程Android開發(fā)

2021-06-03 14:08:03

開發(fā)技能代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产一区三区视频 | 最新国产精品 | 特级黄一级播放 | 久久国产精品色av免费观看 | 久久久国产一区二区三区 | 一区中文字幕 | 污免费网站 | 四虎网站在线观看 | 国产精品日韩欧美一区二区三区 | 日韩综合在线 | 国产精品高清一区二区 | 国产69久久精品成人看动漫 | 99亚洲综合 | 日韩一级免费电影 | 范冰冰一级做a爰片久久毛片 | 国产精品区一区二 | 欧美日韩一区二区在线观看 | 亚洲欧洲精品在线 | 91视频久久 | 欧美专区在线 | 日韩欧美大片 | 国产精品国产a级 | 欧美一区二区在线 | 羞羞视频网 | 美女黄网 | 九色www | 狠狠ri| 久久99视频免费观看 | 一级片av | 精品视频免费 | 欧美一卡二卡在线 | 欧美精品一区二区蜜桃 | 精品一区二区三区四区 | 超碰免费在线观看 | 国产偷录视频叫床高潮对白 | 久久免费香蕉视频 | 色综合一区二区 | 二区三区在线观看 | 国产一区二区在线观看视频 | 精品国产一区二区三区性色av | 一区在线播放 |