av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Java協(xié)程編程之Loom項(xiàng)目實(shí)戰(zhàn)記錄

瀏覽:3日期:2023-12-14 11:49:29
目錄前提Loom項(xiàng)目簡單介紹Virtual Thread使用小結(jié)前提

之前很長一段時(shí)間關(guān)注JDK協(xié)程庫的開發(fā)進(jìn)度,但是前一段時(shí)間比較忙很少去查看OpenJDK官網(wǎng)的內(nèi)容。Java協(xié)程項(xiàng)目Loom(因?yàn)轫?xiàng)目還在開發(fā)階段,OpenJDK給出的官網(wǎng)https://openjdk.java.net/projects/loom中只有少量Loom項(xiàng)目相關(guān)的信息)已經(jīng)在2018年之前立項(xiàng),目前已經(jīng)發(fā)布過基于JDK17編譯和JDK18編譯等早期版本,筆者在下載Loom早期版本的時(shí)候只找到JDK18編譯的版本:

Java協(xié)程編程之Loom項(xiàng)目實(shí)戰(zhàn)記錄

下載入口在:https://jdk.java.net/loom

由于該JDK版本過高,目前可以使用主流IDE導(dǎo)入Loom-JDK-18+9進(jìn)行代碼高亮和語法提醒,暫時(shí)找不到方法進(jìn)行編譯,暫時(shí)使用該JDK執(zhí)行目錄下的的javac命令腳本進(jìn)行編譯,使用java命令腳本運(yùn)行。

Loom項(xiàng)目簡單介紹

Loom - Fibers, Continuations and Tail-Calls for the JVM

Loom項(xiàng)目的標(biāo)題已經(jīng)凸顯了引入的三大新特性:

Fibers:幾年前看過當(dāng)時(shí)的Loom項(xiàng)目的測試代碼就是使用Fiber這個(gè)API(現(xiàn)在這個(gè)API已經(jīng)被移除),意為輕量級線程,即協(xié)程,又稱為輕量級用戶線程,很神奇的是在目前的JDK中實(shí)際上稱為Virtual Thread(虛擬線程) Continuations:直譯為'連續(xù)',實(shí)現(xiàn)上有點(diǎn)像閉包,參考不少資料,尚未準(zhǔn)確理解其具體含義,感覺可以'粗暴'解讀為'程序接下來要執(zhí)行什么'或者'下一個(gè)要執(zhí)行的代碼塊' Tail-Calls:尾調(diào)用VM級別支持

三個(gè)新特性不詳細(xì)展開,目前只是EA版本,還存在修改的可能性,所以也沒必要詳細(xì)展開。

Virtual Thread使用

當(dāng)前版本Loom項(xiàng)目中協(xié)程使用并沒有引入一個(gè)新的公開的虛擬線程VirtualThread類,雖然真的存在VirtualThread,但這個(gè)類使用default修飾符,隱藏在java.lang包中,并且VirtualThread是Thread的子類。協(xié)程的創(chuàng)建API位于Thread類中:

Java協(xié)程編程之Loom項(xiàng)目實(shí)戰(zhàn)記錄

使用此API創(chuàng)建協(xié)程如下:

public static void main(String[] args) { Thread fiber = Thread.startVirtualThread(() -> System.out.println('Hello Fiber'));}

從當(dāng)前的源碼可知:

VirtualThread會通過Thread.currentThread()獲取父線程的調(diào)度器,如果在main方法運(yùn)行,那么上面代碼中的協(xié)程實(shí)例的父線程就是main線程 默認(rèn)的調(diào)度器為系統(tǒng)創(chuàng)建的ForkJoinPool實(shí)例(VirtualThread.DEFAULT_SCHEDULER),輸入的Runnable實(shí)例會被封裝為RunContinuation,最終由調(diào)度器執(zhí)行 對于timed unpark(正在阻塞,等待喚醒)的協(xié)程,使用系統(tǒng)創(chuàng)建的ScheduledExecutorService實(shí)例進(jìn)行喚醒 這個(gè)靜態(tài)工廠方法創(chuàng)建完協(xié)程馬上運(yùn)行,返回的是協(xié)程實(shí)例

如果按照上面的Thread.startVirtualThread()方法去創(chuàng)建協(xié)程,顯然無法定義協(xié)程的名稱等屬性。Loom項(xiàng)目為Thread類引入了建造者模式,比較合理地解決了這個(gè)問題:

// 創(chuàng)建平臺線程建造器,對應(yīng)于Thread實(shí)例public static Builder.OfPlatform ofPlatform() { return new ThreadBuilders.PlatformThreadBuilder();}// 創(chuàng)建虛擬線程建造器,對應(yīng)于VirtualThreadpublic static Builder.OfVirtual ofVirtual() { return new ThreadBuilders.VirtualThreadBuilder();}

簡單說就是:

ofPlatform()方法用于構(gòu)建Thread實(shí)例,這里的Platform Thread(平臺線程)其實(shí)就是JDK1.0引入的線程實(shí)例,普通的用戶線程 ofVirtual()方法用于構(gòu)建VirtualThread實(shí)例,也就是構(gòu)建協(xié)程實(shí)例

這兩個(gè)建造器實(shí)例的所有Setter方法鏈展開如下:

public static void main(String[] args) { Thread.Builder.OfPlatform platformThreadBuilder = Thread.ofPlatform() // 是否守護(hù)線程 .daemon(true) // 線程組 .group(Thread.currentThread().getThreadGroup()) // 線程名稱 .name('thread-1') // 線程名稱前綴 + 起始自增數(shù)字 => prefix + start,下一個(gè)創(chuàng)建的線程名稱就是prefix + (start + 1) // start > 0的情況下會覆蓋name屬性配置 .name('thread-', 1L) // 是否啟用ThreadLocal .allowSetThreadLocals(false) // 是否啟用InheritableThreadLocal .inheritInheritableThreadLocals(false) // 設(shè)置優(yōu)先級 .priority(100) // 設(shè)置線程棧深度 .stackSize(10) // 設(shè)置未捕獲異常處理器 .uncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {} }); // thread-1 Thread firstThread = platformThreadBuilder.unstarted(() -> System.out.println('Hello Platform Thread First')); // thread-2 Thread secondThread = platformThreadBuilder.unstarted(() -> System.out.println('Hello Platform Thread Second')); Thread.Builder.OfVirtual virtualThreadBuilder = Thread.ofVirtual() // 協(xié)程名稱 .name('fiber-1') // 協(xié)程名稱前綴 + 起始自增數(shù)字 => prefix + start,下一個(gè)創(chuàng)建的協(xié)程名稱就是prefix + (start + 1) // start > 0的情況下會覆蓋name屬性配置 .name('fiber-', 1L) // 是否啟用ThreadLocal .allowSetThreadLocals(false) // 是否啟用InheritableThreadLocal .inheritInheritableThreadLocals(false) // 設(shè)置調(diào)度器,Executor實(shí)例,也就是調(diào)度器是一個(gè)線程池,設(shè)置為NULL會使用VirtualThread.DEFAULT_SCHEDULER .scheduler(null) // 設(shè)置未捕獲異常處理器 .uncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {} }); // fiber-1 Thread firstFiber = virtualThreadBuilder.unstarted(() -> System.out.println('Hello Platform Virtual First')); // fiber-2 Thread secondFiber = virtualThreadBuilder.unstarted(() -> System.out.println('Hello Platform Virtual Second'));}

這里可以發(fā)現(xiàn)一點(diǎn),就是建造器是可以復(fù)用的。如果想用建造器創(chuàng)建同一批參數(shù)設(shè)置相同的線程或者協(xié)程,可以設(shè)置name(String prefix, long start)方法,定義線程或者協(xié)程的名稱前綴和一個(gè)大于等于0的數(shù)字,反復(fù)調(diào)用Builder#unstarted(Runnable task)方法就能批量創(chuàng)建線程或者協(xié)程,名稱就設(shè)置為prefix + start、prefix + (start + 1)、prefix + (start + 2)以此類推。協(xié)程創(chuàng)建基本就是這么簡單,運(yùn)行的話直接調(diào)用start()方法:

public class FiberSample2 { public static void main(String[] args) throws Exception {Thread.ofVirtual().name('fiber-1').allowSetThreadLocals(false).inheritInheritableThreadLocals(false).unstarted(() -> { Thread fiber = Thread.currentThread(); System.out.printf('[%s,daemon:%s,virtual:%s] - Hello Worldn', fiber.getName(), fiber.isDaemon(), fiber.isVirtual());}).start();// 主線程休眠Thread.sleep(Long.MAX_VALUE); }}

目前無法在主流IDE編譯上面的類,所以只能使用該JDK目錄下的工具編譯和運(yùn)行,具體如下:

# 執(zhí)行 - 當(dāng)前目錄I:J-Projectsframework-source-codefiber-samplesrcmainjava(1)編譯:I:EnvironmentJavajdk-18-loombinjavac.exe I:J-Projectsframework-source-codefiber-samplesrcmainjavacnthrowxfibersampleFiberSample2.java(2)執(zhí)行main方法:I:EnvironmentJavajdk-18-loombinjava.exe cn.throwx.fiber.sample.FiberSample2

Java協(xié)程編程之Loom項(xiàng)目實(shí)戰(zhàn)記錄

這里也看出了一點(diǎn),所有的協(xié)程實(shí)例的daemon標(biāo)識默認(rèn)為true且不能修改。

小結(jié)

如果用嘗鮮的角度去使用Loom項(xiàng)目,可以提前窺探JVM開發(fā)者們是如何基于協(xié)程這個(gè)重大特性進(jìn)行開發(fā)的,這對于提高學(xué)習(xí)JDK內(nèi)核代碼的興趣有不少幫助。從目前來看,對于協(xié)程的實(shí)現(xiàn)Loom項(xiàng)目距離RELEASE版本估計(jì)還有不少功能需要完善,包括新增API的穩(wěn)定性,以及協(xié)程是否能夠移植到原有的JUC類庫中使用(當(dāng)前的Loom-JDK-18+9沒有對原來的線程池等類庫進(jìn)行修改)等問題需要解決,所以在保持關(guān)注的過程中靜心等待吧。

到此這篇關(guān)于Java協(xié)程編程之Loom項(xiàng)目嘗鮮的文章就介紹到這了,更多相關(guān)Java Loom項(xiàng)目內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日本久久精品视频 | 精品一区二区三区四区 | 羞羞的视频在线观看 | 91精品国产91久久久久久吃药 | 国产视频1区| 成人精品一区二区 | 久久久999国产精品 中文字幕在线精品 | 国产精品成人一区二区三区 | 少妇午夜一级艳片欧美精品 | 久久九九免费 | 国产清纯白嫩初高生视频在线观看 | 黄色在线免费观看视频 | 一区二区三区在线播放视频 | 久久69精品久久久久久久电影好 | 91精品国产91 | 国产一区亚洲二区三区 | 免费av在线网站 | 天天色图 | 人人鲁人人莫人人爱精品 | 米奇7777狠狠狠狠视频 | 性高湖久久久久久久久 | 国产男女视频网站 | 日韩欧美国产精品 | 国产欧美在线视频 | 欧美xxxx日本 | 视频一区二区在线观看 | 99综合网 | jizz18国产 | 人成在线 | 久久久久久国产 | 亚洲国产免费 | 日本三级黄视频 | 一区二区在线 | 亚洲人成网亚洲欧洲无码 | 毛片在线看片 | 中文字幕一区在线观看视频 | 亚洲免费人成在线视频观看 | 毛片大全 | 精品日韩一区 | 欧美精品一区二区三区在线播放 | 亚洲有码转帖 |