欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

還有很多異步回調, 組合處理

創(chuàng)建任務

1. .supplyAsync

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

2. .runAsync

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

        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); // 推薦使用

以上兩個方法都有兩個構造方法, 默認不指定自定義線程池, 他會指定默認的提交任務的方法

    // 查看cpu的核數(shù)是否大于1核
    private static final boolean useCommonPool =
        (ForkJoinPool.getCommonPoolParallelism() > 1);
 
    // 如果大于1核 則調用execute方法, 每次創(chuàng)建一個線程
    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(); }
    }

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

異步回調

指的是 異步任務結束后調用的任務

1. .thenApply

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

2. .thenAccept

不帶返回值的異步回調函數(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í)行的異步任務
        CompletableFuture<String> thenApply = future.thenApply((result) -> {
            System.out.println("future2 " +new Date());
            System.out.println(result);
            return "bbb" + result;
        });

3. .exceptionally

異步任務出現(xià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.exceptionally((result) -> {
            System.out.println("future3 " + result);
            return "bbb" + result;
        });
        
        // 出現(xiàn)異常則返回異常, 沒異常則返回future的返回值
        System.out.println(exceptionally.get());

去掉異常

4. .whenComplete

當主任務出現(xiàn)異常時, 會終止任務,get的時候會拋出主任務的異常, 入?yún)⒅禐閚ull, 否則正常運行

        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());

去掉異常

組合處理

....

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

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

相關文章

  • Java 8 引入lambda表達式的原因解析

    Java 8 引入lambda表達式的原因解析

    這篇文章主要介紹了Java 8 引入lambda表達式的原因解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Java實現(xiàn)常用加密算法——單向加密算法MD5和SHA

    Java實現(xiàn)常用加密算法——單向加密算法MD5和SHA

    本篇文章主要介紹了Java實現(xiàn)常用加密算法——單向加密算法MD5和SHA,信息加密后數(shù)據(jù)更安全,需要的朋友可以參考下。
    2016-10-10
  • java繼承學習之super的用法解析

    java繼承學習之super的用法解析

    本文介紹java繼承super的用法,Java繼承是會用已存在的類的定義作為基礎建立新類的技術新類的定義可以增加新的數(shù)據(jù)或者新的功能,也可以使用父類的功能,但不能選擇性的繼承父類 這種繼承使得復用以前的代碼非常容易,能夠大大的縮短開發(fā)的周期,需要的朋友可以參考下
    2022-02-02
  • JAVAEE中用Session簡單實現(xiàn)購物車功能示例代碼

    JAVAEE中用Session簡單實現(xiàn)購物車功能示例代碼

    本篇文章主要介紹了JAVAEE中用Session簡單實現(xiàn)購物車功能示例代碼,非常具有實用價值,需要的朋友可以參考下。
    2017-03-03
  • MyBatis中PageHelper不生效的解決方案

    MyBatis中PageHelper不生效的解決方案

    這篇文章主要介紹了MyBatis中PageHelper不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java中Collections.sort排序詳解

    java中Collections.sort排序詳解

    這篇文章主要介紹了java中Collections.sort排序詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Spring實戰(zhàn)之緩存使用key操作示例

    Spring實戰(zhàn)之緩存使用key操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之緩存使用key操作,結合實例形式分析了Spring緩存使用key具體配置、屬性、領域模型等相關操作技巧,需要的朋友可以參考下
    2020-01-01
  • java如何自定義List中的sort()排序,用于日期排序

    java如何自定義List中的sort()排序,用于日期排序

    這篇文章主要介紹了java如何自定義List中的sort()排序,用于日期排序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot集成Auth0 JWT的示例代碼

    SpringBoot集成Auth0 JWT的示例代碼

    本文主要介紹了SpringBoot集成Auth0 JWT的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java并發(fā)編程Callable與Future的應用實例代碼

    Java并發(fā)編程Callable與Future的應用實例代碼

    這篇文章主要介紹了Java并發(fā)編程Callable與Future的應用實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論