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

Java協(xié)程編程之Loom

 更新時(shí)間:2021年08月27日 10:20:41   作者:Throwable  
這篇文章主要介紹了Java協(xié)程編程Loom的方法,需要的朋友請(qǐng)看下文

Java協(xié)程編程Loom

前提:

OpenJDK給出的官網(wǎng)https://openjdk.java.net/projects/loom有少量Loom項(xiàng)目相關(guān)的信息)JDK17編譯和JDK18編譯等早期版本,Loom早期版本JDK18編譯的版本:下載入口在:https://jdk.java.net/loom

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

1、Loom項(xiàng)目簡(jiǎn)單介紹

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

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

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

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

2、Virtual Thread使用

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

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

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

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

  • VirtualThread會(huì)通過(guò)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í)例會(huì)被封裝為RunContinuation,最終由調(diào)度器執(zhí)行
  • 對(duì)于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é)程,顯然無(wú)法定義協(xié)程的名稱等屬性。Loom項(xiàng)目為Thread類引入了建造者模式,比較合理地解決了這個(gè)問(wèn)題:

// 創(chuàng)建平臺(tái)線程建造器,對(duì)應(yīng)于Thread實(shí)例
public static Builder.OfPlatform ofPlatform() {
    return new ThreadBuilders.PlatformThreadBuilder();
}

// 創(chuàng)建虛擬線程建造器,對(duì)應(yīng)于VirtualThread
public static Builder.OfVirtual ofVirtual() {
    return new ThreadBuilders.VirtualThreadBuilder();
}

簡(jiǎn)單說(shuō)就是:

ofPlatform()方法用于構(gòu)建Thread實(shí)例,這里的Platform Thread(平臺(tái)線程)其實(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的情況下會(huì)覆蓋name屬性配置
            .name("thread-", 1L)
            // 是否啟用ThreadLocal
            .allowSetThreadLocals(false)
            // 是否啟用InheritableThreadLocal
            .inheritInheritableThreadLocals(false)
            // 設(shè)置優(yōu)先級(jí)
            .priority(100)
            // 設(shè)置線程棧深度
            .stackSize(10)
            // 設(shè)置未捕獲異常處理器
            .uncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                @Override
                public 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的情況下會(huì)覆蓋name屬性配置
            .name("fiber-", 1L)
            // 是否啟用ThreadLocal
            .allowSetThreadLocals(false)
            // 是否啟用InheritableThreadLocal
            .inheritInheritableThreadLocals(false)
            // 設(shè)置調(diào)度器,Executor實(shí)例,也就是調(diào)度器是一個(gè)線程池,設(shè)置為NULL會(huì)使用VirtualThread.DEFAULT_SCHEDULER
            .scheduler(null)
            // 設(shè)置未捕獲異常處理器
            .uncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                @Override
                public 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)建基本就是這么簡(jiǎn)單,運(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 World\n", fiber.getName(),
                            fiber.isDaemon(), fiber.isVirtual());
                }).start();
        // 主線程休眠
        Thread.sleep(Long.MAX_VALUE);
    }
}

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

# 執(zhí)行 - 當(dāng)前目錄I:\J-Projects\framework-source-code\fiber-sample\src\main\java
(1)編譯:I:\Environment\Java\jdk-18-loom\bin\javac.exe I:\J-Projects\framework-source-code\fiber-sample\src\main\java\cn\throwx\fiber\sample\FiberSample2.java
(2)執(zhí)行main方法:I:\Environment\Java\jdk-18-loom\bin\java.exe  cn.throwx.fiber.sample.FiberSample2

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

以上就是Java協(xié)程編程之Loom的詳細(xì)內(nèi)容,更多關(guān)于Java編程Loom的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳述 DB2 分頁(yè)查詢及 Java 實(shí)現(xiàn)的示例

    詳述 DB2 分頁(yè)查詢及 Java 實(shí)現(xiàn)的示例

    本篇文章主要介紹了詳述 DB2 分頁(yè)查詢及 Java 實(shí)現(xiàn)的示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 詳解Java中KMP算法的圖解與實(shí)現(xiàn)

    詳解Java中KMP算法的圖解與實(shí)現(xiàn)

    KMP算法是一種神奇的字符串匹配算法,在對(duì)超長(zhǎng)字符串進(jìn)行模板匹配的時(shí)候比暴力匹配法的效率會(huì)高不少。本文將利用圖解為大家詳細(xì)講解KMP算法的實(shí)現(xiàn),需要的可以參考一下
    2022-05-05
  • java基于OpenGL ES實(shí)現(xiàn)渲染實(shí)例

    java基于OpenGL ES實(shí)現(xiàn)渲染實(shí)例

    這篇文章主要介紹了java基于OpenGL ES實(shí)現(xiàn)渲染,實(shí)例分析了OpenGL渲染操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • Monaco?Editor實(shí)現(xiàn)sql和java代碼提示實(shí)現(xiàn)示例

    Monaco?Editor實(shí)現(xiàn)sql和java代碼提示實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Monaco?Editor代碼提示sql和java實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java中if語(yǔ)句return用法和有無(wú)括號(hào)的區(qū)別

    Java中if語(yǔ)句return用法和有無(wú)括號(hào)的區(qū)別

    本文主要介紹了Java中if語(yǔ)句return用法和有無(wú)括號(hào)的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • java map遍歷的四種方法總結(jié)

    java map遍歷的四種方法總結(jié)

    以下是我整理的關(guān)于java中map的遍歷的四種方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • httpclient 請(qǐng)求http數(shù)據(jù),json轉(zhuǎn)map的實(shí)例

    httpclient 請(qǐng)求http數(shù)據(jù),json轉(zhuǎn)map的實(shí)例

    下面小編就為大家?guī)?lái)一篇httpclient 請(qǐng)求http數(shù)據(jù),json轉(zhuǎn)map的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • Java信號(hào)量全解析

    Java信號(hào)量全解析

    這篇文章主要介紹了Java信號(hào)量的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Java中的Optional類用法詳細(xì)講解

    Java中的Optional類用法詳細(xì)講解

    這篇文章詳細(xì)介紹了Java中Optional類的使用,包括創(chuàng)建Optional對(duì)象,Optional對(duì)象的常用方法,如get、orElse、orElseGet、orElseThrow等,以及Optional類結(jié)合Lambda表達(dá)式和StreamAPI的使用,需要的朋友可以參考下
    2024-10-10
  • springboot過(guò)濾器和攔截器的實(shí)例代碼

    springboot過(guò)濾器和攔截器的實(shí)例代碼

    這篇文章主要介紹了springboot過(guò)濾器和攔截器的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

阿瓦提县| 兴仁县| 垦利县| 额尔古纳市| 巫溪县| 定远县| 南溪县| 临泽县| 苏尼特右旗| 滕州市| 阜新市| 巴林右旗| 巴青县| 灵武市| 鄂温| 遵化市| 宁武县| 长治市| 酉阳| 基隆市| 兰州市| 贡嘎县| 陇西县| 白朗县| 和龙市| 科技| 昂仁县| 牡丹江市| 喀喇沁旗| 长白| 岳池县| 乌海市| 晋州市| 大邑县| 芦溪县| 南投市| 吉林省| 丘北县| 惠安县| 班玛县| 江华|