日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java協程編程之Loom項目實戰記錄

瀏覽:28日期:2023-12-14 11:49:29
目錄前提Loom項目簡單介紹Virtual Thread使用小結前提

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

Java協程編程之Loom項目實戰記錄

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

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

Loom項目簡單介紹

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

Loom項目的標題已經凸顯了引入的三大新特性:

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

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

Virtual Thread使用

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

Java協程編程之Loom項目實戰記錄

使用此API創建協程如下:

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

從當前的源碼可知:

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

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

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

簡單說就是:

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

這兩個建造器實例的所有Setter方法鏈展開如下:

public static void main(String[] args) { Thread.Builder.OfPlatform platformThreadBuilder = Thread.ofPlatform() // 是否守護線程 .daemon(true) // 線程組 .group(Thread.currentThread().getThreadGroup()) // 線程名稱 .name('thread-1') // 線程名稱前綴 + 起始自增數字 => prefix + start,下一個創建的線程名稱就是prefix + (start + 1) // start > 0的情況下會覆蓋name屬性配置 .name('thread-', 1L) // 是否啟用ThreadLocal .allowSetThreadLocals(false) // 是否啟用InheritableThreadLocal .inheritInheritableThreadLocals(false) // 設置優先級 .priority(100) // 設置線程棧深度 .stackSize(10) // 設置未捕獲異常處理器 .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() // 協程名稱 .name('fiber-1') // 協程名稱前綴 + 起始自增數字 => prefix + start,下一個創建的協程名稱就是prefix + (start + 1) // start > 0的情況下會覆蓋name屬性配置 .name('fiber-', 1L) // 是否啟用ThreadLocal .allowSetThreadLocals(false) // 是否啟用InheritableThreadLocal .inheritInheritableThreadLocals(false) // 設置調度器,Executor實例,也就是調度器是一個線程池,設置為NULL會使用VirtualThread.DEFAULT_SCHEDULER .scheduler(null) // 設置未捕獲異常處理器 .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'));}

這里可以發現一點,就是建造器是可以復用的。如果想用建造器創建同一批參數設置相同的線程或者協程,可以設置name(String prefix, long start)方法,定義線程或者協程的名稱前綴和一個大于等于0的數字,反復調用Builder#unstarted(Runnable task)方法就能批量創建線程或者協程,名稱就設置為prefix + start、prefix + (start + 1)、prefix + (start + 2)以此類推。協程創建基本就是這么簡單,運行的話直接調用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目錄下的工具編譯和運行,具體如下:

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

Java協程編程之Loom項目實戰記錄

這里也看出了一點,所有的協程實例的daemon標識默認為true且不能修改。

小結

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

到此這篇關于Java協程編程之Loom項目嘗鮮的文章就介紹到這了,更多相關Java Loom項目內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久只有精品| 国产99在线| 日韩国产精品久久久久久亚洲| 国产欧美另类| 亚洲综合电影| 免费精品视频最新在线| 欧美伊人久久| 久久精品国产久精国产| 欧美 日韩 国产精品免费观看| 老司机精品久久| 国产高清亚洲| 国产一区亚洲| 国产情侣久久| 久久精品不卡| 日韩一区精品| 成人日韩在线| 日韩毛片一区| 欧美一级精品| 欧美一区在线观看视频| 99久久亚洲精品| 欧美一级网址| 欧美日韩一二| 国产午夜精品一区在线观看| 日韩不卡免费高清视频| 亚洲精品第一| 欧美精选视频一区二区| 日韩中文一区二区| 日韩欧美不卡| 日本久久一区| 激情婷婷欧美| 美腿丝袜在线亚洲一区| 午夜精品网站| 激情久久一区二区| 亚洲精品中文字幕99999| 天堂资源在线亚洲| 国产精品久久国产愉拍| 韩日一区二区三区| 国产劲爆久久| 午夜在线视频一区二区区别| 国产美女高潮在线| 国产视频网站一区二区三区| 日韩亚洲精品在线| 国产96在线亚洲| 日本一区中文字幕| 久久国产日本精品| 鲁大师精品99久久久| 蜜臀久久久99精品久久久久久| 福利欧美精品在线| 亚洲精品伊人| 一本一道久久a久久| 粉嫩av一区二区三区四区五区 | 久久不卡日韩美女| 91国语精品自产拍| 麻豆一区二区在线| 欧美资源在线| 国内揄拍国内精品久久| 一区二区三区四区在线观看国产日韩| 国产精品欧美一区二区三区不卡| 免费日韩一区二区三区| 亚洲精品一区二区在线看| 国产精品免费精品自在线观看| 91精品福利| 电影91久久久| 日韩精品一二三四| 99视频精品全部免费在线视频| 国产精品99久久免费| 亚洲精品在线a| 国产毛片久久| 91精品一区二区三区综合在线爱| 欧美激情福利| 国产一级成人av| 日韩av一级片| 欧美亚洲免费| 91精品美女| 日韩福利视频导航| 日韩不卡在线观看日韩不卡视频| 久久午夜精品| 日本免费久久| 国产精品久久久亚洲一区| 日韩国产欧美在线播放| 亚洲视频国产精品| 久久国产精品久久w女人spa| 亚洲午夜91| 亚洲手机在线| 亚洲网站视频| 亚洲综合精品四区| 国产精品宾馆| 日韩国产高清在线| 蜜芽一区二区三区| 亚洲女同一区| 欧美精选视频一区二区| 精品国产精品国产偷麻豆 | 国产亚洲字幕| 免费成人av在线播放| 国产精品av久久久久久麻豆网| 麻豆高清免费国产一区| 日韩有吗在线观看| 国产毛片久久| 欧美va天堂在线| 欧产日产国产精品视频| 成人在线黄色| 久久精品一区二区国产| 国产精品一区二区三区av麻 | 首页亚洲欧美制服丝腿| 99久久九九| 久久久久国产精品一区三寸| 三级在线看中文字幕完整版| 成人一区不卡| 精品久久美女| 久久wwww| 欧美国产专区| 国产精品亚洲欧美一级在线| 日本中文字幕不卡| 深夜福利一区| 69堂免费精品视频在线播放| 亚洲精品大片| 国产高清不卡| 久久久一本精品| 国产亚洲网站| 在线观看亚洲精品福利片| 欧美日本不卡| 激情视频网站在线播放色| 欧美成人精品| 日韩精品视频网站| 精品国产a一区二区三区v免费| 日韩欧美一区二区三区免费看| 美女久久久久| 日韩精品成人| 久久男人天堂| 欧美专区一区二区三区| 国产日韩免费| 九九精品调教| 亚洲有吗中文字幕| 欧美黄色一区| 美女亚洲一区| 成人国产精品久久| 久久精品主播| 模特精品在线| 国产亚洲字幕| jizzjizz中国精品麻豆| 欧美99久久| 午夜天堂精品久久久久| 国产精品v亚洲精品v日韩精品| 国产精品毛片久久| 国产一区欧美| 日韩精品欧美大片| 国产精品成人a在线观看| 亚洲h色精品| 亚洲一区二区三区四区电影| 亚洲精品在线国产| 69精品国产久热在线观看| 久久激情av| 国产精品高颜值在线观看| 成人av二区| 午夜久久av| 精品国产精品国产偷麻豆 | 日本午夜精品一区二区三区电影| 国产极品模特精品一二| 日韩精品久久久久久久电影99爱| 首页欧美精品中文字幕| 国产日产一区| 欧美aa在线观看| 伊人久久婷婷| 欧美精品影院| 青青久久av| 日本成人中文字幕| 久久中文视频| 精品国产一区二区三区噜噜噜| 亚洲资源av| 日韩成人亚洲| 国产欧美综合一区二区三区| 亚洲精品91| 国产精品久久久久久久久久10秀| 日韩一区欧美二区| 久久久久国产精品一区三寸| 欧美日本不卡| 日韩亚洲在线| 国产a亚洲精品| 日韩国产欧美在线视频| 91成人精品视频| 日韩欧美国产精品综合嫩v| 国产精品网站在线看| 一区二区亚洲视频| 亚洲一级特黄| 国产精品分类| 亚洲午夜久久| 樱桃成人精品视频在线播放| 国产精品精品国产一区二区| 欧美日韩一视频区二区| 免费在线观看不卡| 亚洲一区资源| 国产日产高清欧美一区二区三区| 亚洲一级少妇| 久久国产尿小便嘘嘘| 黄色亚洲精品| 成人av三级| 国产精品白浆| 午夜电影一区| 亚洲h色精品| 精品日韩一区|