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

詳解Java CompletableFuture使用方法以及與FutureTask的區(qū)別

 更新時(shí)間:2021年10月26日 15:34:07   作者:一月三千五  
CompletableFuture實(shí)現(xiàn)了CompletionStage接口和Future接口,前者是對后者的一個(gè)擴(kuò)展,增加了異步回調(diào)、流式處理、多個(gè)Future組合處理的能力,使Java在處理多任務(wù)的協(xié)同工作時(shí)更加順暢便利

總的來說簡潔了FutureTask與線程池的配合使用

沒啥太大區(qū)別吧我覺得, 使用方法不一樣, 多了一些方法 ???

futureTask 創(chuàng)建異步任務(wù)

        FutureTask<String> stringFutureTask = new FutureTask<>(() -> {
            return "aa";
        });
        executorService.execute(stringFutureTask);
        System.out.println(stringFutureTask.get());
 
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            return "aa";
        }, executorService); // 不用手動(dòng)提交了
        System.out.println(future1.get());

還有很多異步回調(diào), 組合處理

創(chuàng)建任務(wù)

1. .supplyAsync

創(chuàng)建一個(gè)帶返回值的任務(wù)

2. .runAsync

創(chuàng)建一個(gè)不帶返回值的任務(wù)

        ExecutorService executorService = Executors.newFixedThreadPool(1);
 
        // 帶返回值
        CompletableFuture future = CompletableFuture.supplyAsync(() -> {
            try {
                System.out.println("future " + new Date());
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "aaa";
        }, executorService); // 推薦使用

以上兩個(gè)方法都有兩個(gè)構(gòu)造方法, 默認(rèn)不指定自定義線程池, 他會(huì)指定默認(rèn)的提交任務(wù)的方法

    // 查看cpu的核數(shù)是否大于1核
    private static final boolean useCommonPool =
        (ForkJoinPool.getCommonPoolParallelism() > 1);
 
    // 如果大于1核 則調(diào)用execute方法, 每次創(chuàng)建一個(gè)線程
    private static final Executor asyncPool = useCommonPool ?
        ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();
 
    static final class ThreadPerTaskExecutor implements Executor {
        public void execute(Runnable r) { new Thread(r).start(); }
    }

所以推薦自定義線程池的方式

異步回調(diào)

指的是 異步任務(wù)結(jié)束后調(diào)用的任務(wù)

1. .thenApply

帶返回值的異步調(diào)用函數(shù), 有入?yún)? 有出參

2. .thenAccept

不帶返回值的異步回調(diào)函數(shù), 有入?yún)?/p>

 
        CompletableFuture future = CompletableFuture.supplyAsync(() -> {
            try {
                System.out.println("future " + new Date());
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "aaa";
        }, executorService);
 
        // future執(zhí)行完之后執(zhí)行的異步任務(wù)
        CompletableFuture<String> thenApply = future.thenApply((result) -> {
            System.out.println("future2 " +new Date());
            System.out.println(result);
            return "bbb" + result;
        });

3. .exceptionally

異步任務(wù)出現(xiàn)異常調(diào)用的回調(diào)方法

        CompletableFuture future = CompletableFuture.supplyAsync(() -> {
            try {
                System.out.println("future " + new Date());
                Thread.sleep(2000);
                int a = 1 / 0;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "aaa";
        }, executorService);
 
        CompletableFuture<String> exceptionally = future.exceptionally((result) -> {
            System.out.println("future3 " + result);
            return "bbb" + result;
        });
        
        // 出現(xiàn)異常則返回異常, 沒異常則返回future的返回值
        System.out.println(exceptionally.get());

去掉異常

4. .whenComplete

當(dāng)主任務(wù)出現(xiàn)異常時(shí), 會(huì)終止任務(wù),get的時(shí)候會(huì)拋出主任務(wù)的異常, 入?yún)⒅禐閚ull, 否則正常運(yùn)行

        CompletableFuture future = CompletableFuture.supplyAsync(() -> {
            try {
                System.out.println("future " + new Date());
                Thread.sleep(2000);
                int a = 1/0;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "aaa";
        }, executorService);
 
        CompletableFuture<String> exceptionally = future.whenComplete((result, error) -> {
            System.out.println("future3 " + result);
            System.out.println("future3 " + error);
        });
        System.out.println(exceptionally.get());

去掉異常

組合處理

....

就是將多個(gè)任務(wù)組合起來執(zhí)行, 時(shí)間原因, 這里我就不介紹了, 大家另行百度吧

到此這篇關(guān)于詳解Java CompletableFuture使用方法的文章就介紹到這了,更多相關(guān)Java CompletableFuture內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea啟動(dòng)springmvc項(xiàng)目時(shí)報(bào)找不到類的解決方法

    idea啟動(dòng)springmvc項(xiàng)目時(shí)報(bào)找不到類的解決方法

    這篇文章主要介紹了idea啟動(dòng)springmvc項(xiàng)目時(shí)報(bào)找不到類的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 老生常談Eclipse中的BuildPath(必看篇)

    老生常談Eclipse中的BuildPath(必看篇)

    下面小編就為大家?guī)硪黄仙U凟clipse中的BuildPath(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過程

    SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過程

    這篇文章主要介紹了SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換方案過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法

    詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法

    這篇文章主要介紹了詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • Java經(jīng)典排序算法之冒泡排序代碼實(shí)例

    Java經(jīng)典排序算法之冒泡排序代碼實(shí)例

    這篇文章主要介紹了Java經(jīng)典排序算法之冒泡排序代碼實(shí)例,相鄰兩元素進(jìn)行比較,如過左側(cè)元素大于右側(cè)元素,則進(jìn)行交換,每完成一次循環(huán)就將最大元素排在最后,下一次循環(huán)是將其它的數(shù)進(jìn)行類似操作,需要的朋友可以參考下
    2023-11-11
  • Mybatis使用@Select注解sql中使用in問題

    Mybatis使用@Select注解sql中使用in問題

    這篇文章主要介紹了Mybatis使用@Select注解sql中使用in問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • MyBatis實(shí)現(xiàn)多表聯(lián)合查詢r(jià)esultType的返回值

    MyBatis實(shí)現(xiàn)多表聯(lián)合查詢r(jià)esultType的返回值

    這篇文章主要介紹了MyBatis多表聯(lián)合查詢r(jià)esultType的返回值,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java如何高效實(shí)現(xiàn)Word文檔對比

    Java如何高效實(shí)現(xiàn)Word文檔對比

    在項(xiàng)目協(xié)作、文檔審核或版本迭代的快節(jié)奏工作中,你是否曾為Word文檔的細(xì)微修改而抓狂,下面我們就來一起探討如何利用Java進(jìn)行Word文檔的自動(dòng)化比較吧
    2025-11-11
  • Java?CyclicBarrier錯(cuò)誤使用的實(shí)例

    Java?CyclicBarrier錯(cuò)誤使用的實(shí)例

    文章描述了一個(gè)Java程序使用CyclicBarrier實(shí)現(xiàn)兩個(gè)線程交替打印字母和數(shù)字時(shí)遇到的問題,由于線程執(zhí)行順序不當(dāng),導(dǎo)致輸出結(jié)果與預(yù)期不符,通過調(diào)整線程的等待和打印順序,解決了問題,文章還提供了一個(gè)控制流圖來詳細(xì)解釋修改前后的程序邏輯
    2025-01-01
  • Java中反射的應(yīng)用

    Java中反射的應(yīng)用

    這篇文章主要介紹了Java中反射的應(yīng)用,通過反射,我們可以在運(yùn)行時(shí)檢查類的屬性、方法和構(gòu)造函數(shù),并且可以在不知道類名的情況下創(chuàng)建對象、調(diào)用方法和訪問屬性,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

宕昌县| 玛多县| 山东| 昆明市| 牙克石市| 大理市| 济源市| 佛冈县| 隆安县| 义乌市| 合水县| 申扎县| 鄂伦春自治旗| 林周县| 大悟县| 磐安县| 惠州市| 略阳县| 武川县| 濮阳市| 都江堰市| 华池县| 蕉岭县| 南丰县| 甘孜| 兰坪| 东安县| 南平市| 南充市| 资阳市| 潜江市| 临海市| 泽州县| 商洛市| 昆明市| 北京市| 峨边| 福清市| 门源| 罗源县| 江油市|