电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:5日期: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
相關文章:
主站蜘蛛池模板: 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 首页-浙江橙树网络技术有限公司| 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | HDPE储罐_厂家-山东九州阿丽贝防腐设备 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 高低温试验房-深圳高低温湿热箱-小型高低温冲击试验箱-爱佩试验设备 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 |