首页 > 编程语言 > 详细

廖雪峰Java11多线程编程-3高级concurrent包-8CompletableFuture

时间:2019-06-16 16:42:50      阅读:117      评论:0      收藏:0      [点我收藏+]

使用Future可以获得异步执行结果

    Future<String> future = executor.submit(task);
    String result = future.get();

但是当我们使用get()获得异步执行结果的时候,这个方法可能会阻塞。我们通过while循环反复调用isDone()来判断异步结果是否已经完成。

    while(!future.isDone()){
        Thread.sleep(1);
    }
    String result = future.get()

所以使用Future获得异步执行的结果有2个方法:

  • 1.调用阻塞方法get()
  • 2.轮询isDone()

这2种方法都不是很好,我们期望在异步任务完成的时候自动返回结果,所以JDK提供了CompletableFuture接口。

CompletableFutrue接口

当我们使用CompletableFuture接口时,任务执行结束的时候,它会自动调用我们设置好的回调函数;当任务发生异常的时候,它也可以自动调用我们设置好的另一个回调函数。

    CompletableFuture<String> cf = getCompletableFutureFromSomewhere();
    cf.thenAccept(new Consumer<String>(){ //thenAccept传入一个回调对象,就可以获得正常运行的异步结果
        public void accept(String result){
            System.out.println("正常运行获得异步结果:"+ result);
        }
    });
    cf.exceptionally(new Function<Throwable, String>(){ //用exceptionally传入一个回调对象,可以获得运行时发生异常的情况
        public String apply(Throwable, String){
            System.out.println("运行发生异常:"+ t.getMessage());
            return null;    
        }   
    });

使用Java8新增的函数式语法可以进一步简化代码

    CompletableFuture<String> cf = getCompletableFutureFromSomewhere();
    cf.thenAccept( (result) -> {
        System.out.println("正常运行获得异步结果");
    });
    cf.exceptionally( (t) -> {
        System.out.println("运行时发生异常:" + t.getMessage());
        return null;
    });

CompletableFuture的优点:

  • 异步任务结束时,会自动回调某个对象的方法
  • 异步任务出错时,会自动回调某个对象的方法
  • 主线程设置好回调后,不再关心异步任务的执行

CompletableFuture的基本用法:

    CompletableFuture<String> cf = CompletableFuture.supplyAsync("异步执行实例");
    cf.thenAccept("获得结果后的操作");
    cf.exceptionally("发生异常时的操作");

廖雪峰Java11多线程编程-3高级concurrent包-8CompletableFuture

原文:https://www.cnblogs.com/csj2018/p/11031781.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!