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

JDK21中虛擬線程到底是什么以及用法總結(jié)(看完便知)

 更新時(shí)間:2023年12月09日 09:32:24   作者:愛讀源碼的大都督  
這篇文章主要給大家介紹了關(guān)于JDK21中虛擬線程到底是什么以及用法的相關(guān)資料,虛擬線程是一種輕量化的線程封裝,由jvm直接調(diào)度和管理,反之普通的線程其實(shí)是調(diào)用的操作系統(tǒng)的能力,對(duì)應(yīng)的是操作系統(tǒng)級(jí)的線程,需要的朋友可以參考下

本文涉及到的技術(shù):虛擬線程、結(jié)構(gòu)化并發(fā)、線程池、TheadLocal,對(duì)原理感興趣的可以直接跳到原理部分。

虛擬線程是JDK19中引入的,JDK21正式發(fā)布,我們先來(lái)看看虛擬線程的幾種用法,然后再來(lái)分析底層實(shí)現(xiàn)原理。

先定義一個(gè)Runnable:

通過(guò)觀察輸出結(jié)果,就能知道當(dāng)前運(yùn)行Task的是不是虛擬線程。

也可以增加以下代碼直接判斷是不是虛擬線程:

Thread.ofVirtual()

手動(dòng)開啟虛擬線程執(zhí)行任務(wù):

自動(dòng)開啟虛擬線程執(zhí)行任務(wù):

兩者輸出結(jié)果類似,為:

根據(jù)名字可以看出確實(shí)是用的VirtualThread,但似乎跟ForkJoinPool有關(guān),后面會(huì)分析。

我們也可以通過(guò)以下方式來(lái)創(chuàng)建普通線程

輸出結(jié)果為:

確實(shí)是普通線程。

還可以先得到一個(gè)ThreadFactory,然后來(lái)創(chuàng)建虛擬線程:

輸出結(jié)果為:

還有一種更簡(jiǎn)單的API:

輸出結(jié)果為:

結(jié)構(gòu)化并發(fā)

在JDK21中還有一個(gè)新特性(預(yù)覽版),叫做結(jié)構(gòu)化并發(fā),也會(huì)自動(dòng)創(chuàng)建虛擬線程來(lái)運(yùn)行代碼,比如:

輸出結(jié)果為:

Executors

還有一種和線程池類似的使用方式:

以上代碼中每個(gè)任務(wù)運(yùn)行時(shí)都會(huì)開啟一個(gè)虛擬線程,輸出結(jié)果為:

表示有3個(gè)虛擬線程。

虛擬線程底層原理

以上大概就是使用或創(chuàng)建虛擬線程的幾種情況了,那到底什么是虛擬線程呢?它跟線程有什么關(guān)系?它跟ForkJoinPool又有什么關(guān)系呢?

虛擬線程畢竟是虛擬的,就像虛擬機(jī)也是虛擬的,是需要真實(shí)操作系統(tǒng)來(lái)支撐運(yùn)行的。而虛擬線程仍然是基于線程來(lái)進(jìn)行調(diào)度執(zhí)行的。

我們先來(lái)看看普通線程的缺點(diǎn)在哪,看下面代碼:

假如是一個(gè)普通線程執(zhí)行上述代碼,在輸出完“before”后,線程就會(huì)睡眠1秒,然后才會(huì)輸出“after”,如果是一個(gè)線程要執(zhí)行3個(gè)這樣的任務(wù),比如:

生成一個(gè)只有一個(gè)線程的線程池,用它來(lái)執(zhí)行三個(gè)任務(wù),實(shí)際上就是串行執(zhí)行這三個(gè)任務(wù),輸出結(jié)果為:

但是,我們好好想想:當(dāng)這個(gè)普通線程執(zhí)行完第一個(gè)任務(wù)的“before”后,需要等1s才執(zhí)行“after”,那能不能在等1s的過(guò)程中去執(zhí)行第二個(gè)任務(wù)的“before”呢?原則上是可以的,這就是虛擬線程要優(yōu)化的點(diǎn)。

大家好好理解一下上面的這句話,這是精髓

我們來(lái)看改成虛擬線程后的運(yùn)行效果,先修改Task:

然后運(yùn)行:

輸出結(jié)果為:

大家運(yùn)行時(shí)可能會(huì)發(fā)現(xiàn)有多個(gè)不同的ForkJoinPool-1-worker,那是因?yàn)槲易隽伺渲?,后面?huì)解釋

不知道大家能不能看懂這個(gè)效果,我們可以發(fā)現(xiàn)有3個(gè)虛擬線程:VirtualThread[#21]、VirtualThread[#23]、VirtualThread[#24],但是只有一個(gè)線程:ForkJoinPool-1-worker-1,雖然只有一個(gè)線程,卻達(dá)到了并行執(zhí)行三個(gè)任務(wù)的效果,其原理就是上面所分析的:

線程先執(zhí)行任務(wù)1,任務(wù)1睡眠的過(guò)程中,線程會(huì)去執(zhí)行任務(wù)2任務(wù)2睡眠的過(guò)程中,線程會(huì)去執(zhí)行任務(wù)3任務(wù)3睡眠的過(guò)程中,線程暫時(shí)沒(méi)有任務(wù)執(zhí)行了過(guò)一會(huì),任務(wù)1睡眠結(jié)束,線程繼續(xù)執(zhí)行任務(wù)1然后,任務(wù)2睡眠結(jié)束,線程繼續(xù)執(zhí)行任務(wù)2最后,任務(wù)3睡眠結(jié)束,線程繼續(xù)執(zhí)行任務(wù)3

這樣就達(dá)到了一個(gè)線程并行執(zhí)行三個(gè)任務(wù)的效果,從中,我們可以看到,線程需要知道:一個(gè)任務(wù)什么時(shí)候開始睡眠了,什么時(shí)候睡眠結(jié)束了,哪個(gè)任務(wù)還沒(méi)開始執(zhí)行,哪個(gè)任務(wù)已經(jīng)在執(zhí)行中了?

但是,任務(wù)是程序員所定義的,所以就需要虛擬線程來(lái)封裝任務(wù),而線程只關(guān)心虛擬線程即可,也就是線程負(fù)責(zé)來(lái)調(diào)度各個(gè)虛擬線程的執(zhí)行,也就是來(lái)判斷虛擬線程是不是睡眠了?是不是正在運(yùn)行?

我們可以把虛擬線程理解為一個(gè)對(duì)象,這個(gè)虛擬線程對(duì)象有幾種狀態(tài),比如是不是睡眠中,是不是運(yùn)行中,而一個(gè)線程可以支持同時(shí)運(yùn)行多個(gè)虛擬線程對(duì)象,當(dāng)線程發(fā)現(xiàn)某個(gè)虛擬線程對(duì)象睡眠時(shí),就會(huì)去運(yùn)行其他的虛擬線程對(duì)象。

或者這么說(shuō):虛擬線程sleep了,底層的線程并不一定sleep了。

所以,虛擬線程就是線程調(diào)度的單位,一個(gè)線程可以調(diào)度很多個(gè)虛擬線程,如果有多個(gè)線程,那當(dāng)然就能調(diào)度更多虛擬線程了,所以在JDK的實(shí)現(xiàn)中,使用ForkJoinPool來(lái)提供線程作為虛擬線程的調(diào)度者,同時(shí)由于ForkJoinPool的任務(wù)竊取機(jī)制,能進(jìn)一步提高任務(wù)并行執(zhí)行的效率。

默認(rèn)情況下,這個(gè)ForkJoinPool中的線程數(shù)等于CPU核心數(shù),我們可以通過(guò)以下參數(shù)來(lái)修改:

  • -Djdk.virtualThreadScheduler.parallelism=1
  • -Djdk.virtualThreadScheduler.maxPoolSize=1

另外,虛擬線程也不用考慮池化,因?yàn)樗幌窬€程,開啟和關(guān)閉一個(gè)線程是需要調(diào)用操作系統(tǒng)的,而虛擬線程跟操作系統(tǒng)沒(méi)關(guān)系。

再另外,JDK21中的虛擬線程也支持ThreadLocal,也就是一個(gè)虛擬線程在執(zhí)行任務(wù)的過(guò)程中,也可以通過(guò)ThreadLocal來(lái)共享數(shù)據(jù),使得我們?cè)陂_發(fā)過(guò)程中就把虛擬線程當(dāng)作普通線程使用就可以了。

還有要注意的是,當(dāng)任務(wù)進(jìn)行網(wǎng)絡(luò)IO、磁盤IO時(shí)也相當(dāng)是sleep了,所以如果虛擬線程用到真實(shí)項(xiàng)目中,就能做到用少量線程支撐較高的并發(fā),從而能大大提高項(xiàng)目的吞吐量,虛擬線程不是用來(lái)提速的,而是用來(lái)提高吞吐量的。

總結(jié)

到此這篇關(guān)于JDK21中虛擬線程到底的文章就介紹到這了,更多相關(guān)JDK21虛擬線程用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java創(chuàng)建Excel數(shù)據(jù)透視表(Pivot?Table)的完整實(shí)戰(zhàn)教程

    Java創(chuàng)建Excel數(shù)據(jù)透視表(Pivot?Table)的完整實(shí)戰(zhàn)教程

    在日常的數(shù)據(jù)分析開發(fā)中,我們經(jīng)常需要對(duì)大量原始數(shù)據(jù)進(jìn)行匯總、分類和統(tǒng)計(jì),本文將介紹如何在?Java?中創(chuàng)建?Excel?數(shù)據(jù)透視表,并給出一個(gè)實(shí)用示例,有需要的小伙伴可以了解下
    2026-03-03
  • MyBatis-Plus TypeHander不生效的問(wèn)題解決

    MyBatis-Plus TypeHander不生效的問(wèn)題解決

    MyBatis-Plus中使用lambdaUpdate更新JSON字段時(shí),TypeHandler未生效導(dǎo)致數(shù)據(jù)截?cái)噱e(cuò)誤,需手動(dòng)轉(zhuǎn)換或顯式指定typeHandler解決,下面就來(lái)介紹一下該問(wèn)題的解決
    2025-08-08
  • Java系統(tǒng)的高并發(fā)解決方法詳解

    Java系統(tǒng)的高并發(fā)解決方法詳解

    這篇文章主要介紹了Java系統(tǒng)的高并發(fā)解決方法,內(nèi)容十分豐富,在這里分享給大家,需要的朋友可以參考。
    2017-09-09
  • IDEA新UI如何移動(dòng)類路徑工具欄到頂部

    IDEA新UI如何移動(dòng)類路徑工具欄到頂部

    文章介紹了IDEA更新新UI后,類路徑工具欄放到底部的問(wèn)題,并提供了解決方案,此外,還提到了如何關(guān)閉主菜單背景色的方法
    2025-01-01
  • Java實(shí)現(xiàn)Excel文件加密解密的示例代碼

    Java實(shí)現(xiàn)Excel文件加密解密的示例代碼

    設(shè)置excel文件保護(hù)時(shí),通常可選擇對(duì)整個(gè)工作簿進(jìn)行加密保護(hù)。無(wú)需設(shè)置文檔保護(hù)時(shí),可撤銷密碼保護(hù),即解密文檔。本文將通過(guò)java程序演示以上加密、解密方法的實(shí)現(xiàn),感興趣的可以了解一下
    2022-05-05
  • MyBatis Plus中代碼生成器使用詳解

    MyBatis Plus中代碼生成器使用詳解

    這篇文章主要介紹了MyBatis Plus中代碼生成器使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 解決gateway配合nacos路由報(bào)錯(cuò):Unable to find instance for XXX問(wèn)題

    解決gateway配合nacos路由報(bào)錯(cuò):Unable to find instance&

    這篇文章主要介紹了解決gateway配合nacos路由報(bào)錯(cuò):Unable to find instance for XXX問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Java從單體架構(gòu)升級(jí)到微服務(wù)要注意的一些問(wèn)題

    Java從單體架構(gòu)升級(jí)到微服務(wù)要注意的一些問(wèn)題

    這篇文章主要介紹了Java從單體架構(gòu)升級(jí)到微服務(wù)要注意的一些問(wèn)題,對(duì)架構(gòu)感興趣的同學(xué),可以參考下
    2021-04-04
  • 安裝IDEA和配置Maven的步驟詳解

    安裝IDEA和配置Maven的步驟詳解

    這篇文章主要介紹了安裝IDEA和配置Maven的步驟詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java使用Redis及其優(yōu)化詳解

    Java使用Redis及其優(yōu)化詳解

    大家好,本篇文章主要分享的是Java使用Redis及其優(yōu)化詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論

清涧县| 昌黎县| 荔浦县| 西乌珠穆沁旗| 上高县| 喀喇| 万全县| 铜鼓县| 茶陵县| 海伦市| 沽源县| 得荣县| 卫辉市| 准格尔旗| 沈阳市| 西和县| 札达县| 渝北区| 湖北省| 孙吴县| 中西区| 湄潭县| 嘉禾县| 崇文区| 洱源县| 松滋市| 玉门市| 佛山市| 博野县| 扶沟县| 门源| 南川市| 汽车| 汝州市| 宜良县| 龙南县| 华池县| 河津市| 威远县| 怀柔区| 盘锦市|