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

Java8 CompletableFuture 異步執(zhí)行操作

 更新時間:2021年06月22日 18:02:04   作者:ACGkaka_  
CompletableFuture是java8提供的基于異步操作的封裝,日常開發(fā)中經(jīng)常會用到,接下來通過本文給大家介紹Java8 CompletableFuture 異步執(zhí)行操作,感興趣的朋友一起看看吧

1.簡介

CompletableFuture 是 JDK8 提供的一個異步執(zhí)行工具。

示例1:

public static void main(String[] args) throws ExecutionException, InterruptedException {
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        for (int i = 0; i < 3; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException ignored) {
            }
        }
        System.out.println("Future Finished.");
    });
    System.out.println("Main Thread Finished.");
    future.get();
}

輸出結(jié)果1:

2.異步執(zhí)行

CompletableFuture 提供了兩個方法用于異步執(zhí)行:

CompletableFuture.runAsync,沒有返回值;
CompletableFuture.supplyAsync,有返回值。

示例:

public static void main(String[] args) throws ExecutionException, InterruptedException {
    // runAsync 沒有返回值
    CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> System.out.println("future1 executed."));
    // supplyAsync 有返回值
    CompletableFuture<Object> future2 = CompletableFuture.supplyAsync(() -> {
        System.out.println("future2 executed.");
        return "result";
    });

    System.out.println("future1.get(): " + future1.get());
    System.out.println("future2.get(): " + future2.get());
}

輸出結(jié)果:

3.守護(hù)線程

CompletableFuture返回的Future默認(rèn)為守護(hù)線程,如果不調(diào)用get()獲取結(jié)果,主線程結(jié)束后會自動結(jié)束。主要有以下4種情景:

  • 情景1: 執(zhí)行時間 > 主線程時間,異步線程會執(zhí)行;
  • 情景2: 執(zhí)行時間 > 主線程,是守護(hù)線程,會被殺死,異步線程不會執(zhí)行;
  • 情景3: 執(zhí)行時間 > 主線程,但是不是守護(hù)線程,不會被殺死,異步線程會執(zhí)行;
  • 情景4: ExecutorService.submit(),默認(rèn)不是守護(hù)線程,不會被殺死,異步線程會執(zhí)行。

示例:

public static void main(String[] args) {
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    // 1.執(zhí)行時間 < 主線程,會打印
    CompletableFuture<Void> future1 = CompletableFuture.runAsync(() ->
		System.out.println("Thread1 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon()));

    // 2.執(zhí)行時間 > 主線程,是守護(hù)線程,會被殺死,不會打印
    CompletableFuture.runAsync(() -> {
        try {
            Thread.sleep(3000L);
            System.out.println("Thread2 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }});

    // 3.執(zhí)行時間 > 主線程,但是不是守護(hù)線程,不會被殺死,會打印
    CompletableFuture.runAsync(() -> {
        try {
            Thread.sleep(1000L);
            System.out.println("Thread3 等待1秒");
            System.out.println("Thread3 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }}, executorService);

    // 4.ExecutorService.submit(),默認(rèn)不是守護(hù)線程,不會被殺死,會打印。
    executorService.submit(() -> {
        try {
            Thread.sleep(2000L);
            System.out.println("Thread4 等待2秒");
            System.out.println("Thread4 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }});

    // 主線程執(zhí)行完畢
    System.out.println("Main Thread Finished.");
    executorService.shutdown();
}

輸出結(jié)果2:

4.處理執(zhí)行結(jié)果

CompletableFuture還封裝了很多處理執(zhí)行結(jié)果操作。操作太多,列舉比較常用的幾種:

thenAccept(): 對結(jié)果進(jìn)行使用;
thenApply(): 對結(jié)果進(jìn)行轉(zhuǎn)換;
exceptionally(): 對異常進(jìn)行處理;
whenComplete(): 相當(dāng)于 thenAccept() + thenApply() + exceptionally().

示例:

public static void main(String[] args) {
    // thenAccept對結(jié)果進(jìn)行使用
    System.out.println("------------------------------");
    CompletableFuture.supplyAsync(() -> "Thread1 Finished.").thenAccept(System.out::println);

    // thenApply對結(jié)果進(jìn)行轉(zhuǎn)換
    System.out.println("------------------------------");
    CompletableFuture.supplyAsync(() -> "Thread2 Finished.")
        .thenApply(s -> s + " + thenApply()")
        .thenAccept(System.out::println);

    // exceptionally對異常進(jìn)行處理
    System.out.println("------------------------------");
    CompletableFuture.supplyAsync(() -> {throw new RuntimeException("Thread3 Failed.");})
        .exceptionally(Throwable::toString).thenAccept(System.out::println);

    // 主線程執(zhí)行完畢
    System.out.println("------------------------------");
    System.out.println("Main Thread Finished.");
}

輸出結(jié)果:

whenComplete() 示例:

public static void main(String[] args) throws ExecutionException, InterruptedException {
    // thenAccept對結(jié)果進(jìn)行使用
    System.out.println("------------------------------");
    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Thread1 Finished.").whenComplete(new BiConsumer<String, Throwable>() {
        @Override
        public void accept(String s, Throwable throwable) {
            System.out.println("result: " + s);
            System.out.println("throwable: " + throwable);
        }
    });

    // exceptionally對異常進(jìn)行處理
    System.out.println("------------------------------");
    CompletableFuture.supplyAsync(() -> {
        throw new RuntimeException("Thread3 Failed.");
    }).whenComplete(new BiConsumer<Object, Throwable>() {
        @Override
        public void accept(Object s, Throwable throwable) {
            System.out.println("result: " + s);
            System.out.println("throwable: " + throwable);
        }
    });

    System.out.println("------------------------------");
    System.out.println("future.get(): " + future.get());

    // 主線程執(zhí)行完畢
    System.out.println("------------------------------");
    System.out.println("Main Thread Finished.");
}

輸出結(jié)果:

整理完畢,完結(jié)撒花~

以上就是Java8 CompletableFuture 異步執(zhí)行的詳細(xì)內(nèi)容,更多關(guān)于Java8 CompletableFuture 異步執(zhí)行的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot?整合mybatis+mybatis-plus的詳細(xì)步驟

    SpringBoot?整合mybatis+mybatis-plus的詳細(xì)步驟

    這篇文章主要介紹了SpringBoot?整合mybatis+mybatis-plus的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Mybatis-plus全局id生成策略詳解

    Mybatis-plus全局id生成策略詳解

    這篇文章主要介紹了Mybatis-plus全局id生成策略詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring JPA之save方法示例詳解

    Spring JPA之save方法示例詳解

    這篇文章主要為大家介紹了Spring JPA之save方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明

    Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明

    這篇文章主要介紹了Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java中double精度丟失問題原因及解決辦法

    Java中double精度丟失問題原因及解決辦法

    使用Java double進(jìn)行運(yùn)算時,經(jīng)常出現(xiàn)精度丟失的問題,總是在一個正確的結(jié)果左右偏0.0000**1,這篇文章主要給大家介紹了關(guān)于Java中double精度丟失問題原因及解決辦法,需要的朋友可以參考下
    2024-01-01
  • 基于Java的MathML轉(zhuǎn)圖片的方法(示例代碼)

    基于Java的MathML轉(zhuǎn)圖片的方法(示例代碼)

    最近接到一個新需求mathML轉(zhuǎn)圖片怎么實(shí)現(xiàn)呢?剛開始還真是蒙圈了,不知道怎么實(shí)現(xiàn),今天小編記錄一種基于Java的MathML轉(zhuǎn)圖片的方法,感興趣的朋友一起看看吧
    2021-06-06
  • java線程中斷?interrupt?和?LockSupport解析

    java線程中斷?interrupt?和?LockSupport解析

    這篇文章主要為大家介紹了java線程中斷?interrupt?和?LockSupport示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • java計算機(jī)器人的運(yùn)動范圍

    java計算機(jī)器人的運(yùn)動范圍

    這篇文章主要為大家詳細(xì)介紹了java計算機(jī)器人運(yùn)動范圍的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java讀取txt文件中的數(shù)據(jù)賦給String變量方法

    Java讀取txt文件中的數(shù)據(jù)賦給String變量方法

    今天小編就為大家分享一篇Java讀取txt文件中的數(shù)據(jù)賦給String變量方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 基于ChatGPT+SpringBoot實(shí)現(xiàn)智能聊天AI機(jī)器人接口并上線至服務(wù)器的方法

    基于ChatGPT+SpringBoot實(shí)現(xiàn)智能聊天AI機(jī)器人接口并上線至服務(wù)器的方法

    ChatGPT是一款基于自然語言處理技術(shù)的聊天機(jī)器人,ChatGPT可以模擬真實(shí)的人類對話,并能夠更貼近用戶的需求,提供更有價值的服務(wù),這篇文章主要介紹了基于ChatGPT+SpringBoot實(shí)現(xiàn)智能聊天AI機(jī)器人接口并上線至服務(wù)器,需要的朋友可以參考下
    2023-02-02

最新評論

南江县| 金寨县| 兴安盟| 印江| 光泽县| 运城市| 原阳县| 鄂尔多斯市| 北碚区| 逊克县| 嘉善县| 凭祥市| 南部县| 仪陇县| 历史| 许昌县| 平远县| 隆林| 崇礼县| 和平县| 洛阳市| 祁阳县| 梁平县| 武穴市| 南昌县| 光泽县| 阿拉善左旗| 讷河市| 宜兰县| 吴旗县| 呈贡县| 三穗县| 宜昌市| 铁岭市| 镇平县| 辰溪县| 大同县| 达孜县| 商城县| 镇宁| 平果县|