supplyAsync

异步开启一个任务,并返回一个结果;入参为Supply函数式接口;

CompletableFuture busA = CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread("A公车发车");SmallTool.sleepMillis(3000);return "A公车到站";
});
SmallTool.printTimeAndThread(busA);

thenCombine

连接两个异步任务,即接收两个异步任务的结果,入参为CompletableStage和BiFunction函数式接口;
也可以等价于在调用了两个CompletableFuture的join()方法后将结果输入到BiFunction;

SmallTool.printTimeAndThread("小白下单烧鸭饭");
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread("大厨斩烧鸭!");SmallTool.sleepMillis(3000);return "烧鸭ok";
}).thenCombine(CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread("服务员煮米饭");SmallTool.sleepMillis(2000);return "米饭ok";
}), (d, r) -> {SmallTool.printTimeAndThread(d);SmallTool.printTimeAndThread(r);return "服务员盛饭";
});
SmallTool.printTimeAndThread("小白打游戏");
SmallTool.printTimeAndThread(completableFuture.join());
SmallTool.printTimeAndThread("小白吃烧鸭饭");

thenCompose

用于串联两个异步任务,即在前一个任务结束后将其结果作为入参传入Function,Function内部再启动一个CompletableFuture并执行;输入形参是
Function<? super T, ? extends CompletionStage>;

SmallTool.printTimeAndThread("小白到餐厅点餐,点了米饭 + 烧鸭! ");
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread("大厨砍烧鸭 ");SmallTool.sleepMillis(3000);return "大厨砍完鸭";
}).thenCompose((res) -> CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread(res);SmallTool.printTimeAndThread("服务员盛饭!");SmallTool.sleepMillis(1000);return "上菜";
}));
SmallTool.printTimeAndThread("小白打游戏");
SmallTool.printTimeAndThread(String.format("%s, 小白吃饭", completableFuture.join()));

applyToEither

用于处理当两个线程都在执行时,不管哪个先执行完,只要有一个返回就触发另一个CompletableStage的执行

CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread("A公车发车");SmallTool.sleepMillis(3000);return "A公车到站";
}).applyToEither(CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread("B公车发车");SmallTool.sleepMillis(2000);return "B公车到站";}), bus -> bus
).thenCompose(bus -> CompletableFuture.runAsync(() -> {SmallTool.printTimeAndThread(String.format("%s , 小白上车", bus));
})).join();

thenApply

用于将上次的结果作为当前本次操作的输入参数,该方法接收形参是Function<U,V>;有别于thenCompose的Function<U, V extends CompletableStage>;

CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread("项目经历开始讲解需求");SmallTool.sleepMillis(2000);return "讲解完毕";
}).thenApply((preRes) -> {SmallTool.printTimeAndThread(String.format("项目经理 %s, 程序员开始编码", preRes));SmallTool.sleepMillis(3000);return "编码完毕";
}).thenCompose((preRes) -> CompletableFuture.runAsync(() ->{SmallTool.printTimeAndThread(preRes);SmallTool.printTimeAndThread("打包构建");SmallTool.sleepMillis(2000);SmallTool.printTimeAndThread("上测试环境");
})).thenRun(() -> {SmallTool.printTimeAndThread("测试小哥开始测试");SmallTool.sleepMillis(1000);SmallTool.printTimeAndThread("无发现bug");SmallTool.printTimeAndThread("上线");
}).join();

exceptionally

用于获取异步任务的异常结果并进行处理;
入参是Function<Throwable, ? extends T>函数式接口;

CompletableFuture.runAsync(() -> {SmallTool.printTimeAndThread("出bug 出bug 出bug");SmallTool.sleepMillis(3000);throw new RuntimeException("bug");
}).exceptionally((e) -> {e.printStackTrace();return null;
}).join();

handle

不管是正常还是异常结束,当执行完毕时会调用该方法;
入参是BiFunction<? super T, Throwable, ? extends U>,返回一个CompletableFuture;

CompletableFuture<String> join = CompletableFuture.supplyAsync(() -> {SmallTool.sleepMillis(1000);return "avc";
}).handle((res, e) -> {return CompletableFuture.supplyAsync(() -> {SmallTool.printTimeAndThread(res);e.printStackTrace();return "bvc";});
}).join();
System.out.println(join);

异步编程之美——CompletableFuture相关推荐

  1. 【异步编程学习笔记】JDK中的FutureTask和CompletableFuture详解(使用示例、源码)

    文章目录 FutureTask概述 使用实例 类图结构 FutureTask的run()方法 FutureTask的局限性 CompletableFuture概述 CompletableFuture代 ...

  2. JUC系列(十一) | Java 8 CompletableFuture 异步编程

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  3. Java8新的异步编程方式 CompletableFuture(三)

    前面两篇文章已经整理了CompletableFuture大部分的特性,本文会整理完CompletableFuture余下的特性,以及将它跟RxJava进行比较. 3.6 Either Either 表 ...

  4. CompletableFuture 异步编程

    本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 全文摘要: ...

  5. Java中如何使用非阻塞异步编程——CompletableFuture

    分享一波:程序员赚外快-必看的巅峰干货 对于Node开发者来说,非阻塞异步编程是他们引以为傲的地方.而在JDK8中,也引入了非阻塞异步编程的概念.所谓非阻塞异步编程,就是一种不需要等待返回结果的多线程 ...

  6. java 并发 异步_Java并发 CompletableFuture异步编程的实现

    前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作.如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例如下面的示例代码,现在是串行的,为了提升性能,我们得 ...

  7. 【Java并发编程实战】(十七):Future和CompletableFuture的原理及实战——异步编程没有那么难

    文章目录 引言 生活中的例子 场景1 场景2 Java中的Future 如何获取Future Future的主要方法及使用 Future的核心源码 Future模式的高阶版本-- Completabl ...

  8. CompletableFuture(异步编程)

    CompletableFuture的由来 CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调.流式处理.多个Futur ...

  9. 【转载】Java 8 的异步编程 CompletableFuture

    文章目录 一个例子回顾 Future 一个例子走进CompletableFuture CompletableFuture使用场景 创建异步任务 supplyAsync方法 runAsync方法 任务异 ...

最新文章

  1. HAOI2011 Problem b
  2. python课后题答案第五章_Python语言程序设计(美-梁勇)第5章习题解答
  3. 短信网址价值不大不应被热炒
  4. LOL快要凉?腾讯电竞应如何破除游戏生命周期诅咒
  5. 定义范围中的备选方案生成、横向思维、创建WBS、工作包定义、WBS、确认范围过程和实施质量过程的关系、联合应用设计和质量功能展开QFD
  6. Android照片墙完整版,完美结合 内存方案 LruCache 和 硬盘方案 DiskLruCache
  7. 玩游戏4g计算机的内存不足,玩游戏时出现存储空间不足, 无法完成此操作, 到底是何原因?...
  8. 九大经典算法之选择排序、堆排序
  9. 信号时频图的横纵坐标对调
  10. PostgreSQL如何使用PLJava支持Java编程
  11. .Net Core DI,如何在程序集中注册所有现有的可分配类型
  12. 在java中创建线程有几种办法_Java中创建线程的几种主流方式
  13. “升级 iOS 最新系统后,我弃用了 iPhone!”
  14. “搞机器学习没前途”
  15. lua面向对象是怎么实现的
  16. 力扣-559. N 叉树的最大深度
  17. WPF学习之路(二) XAML(续)
  18. sql plus能登录 plsqldev 登录提示 无法解析指定的连接标识符/PLSQL Developer的安装目录不能带括号/win10安装Oracle PLSQL Developer不能登录
  19. mysql双机热备份_MySQL双机热备份试验
  20. 移动光猫怎么设置虚拟服务器设置,移动光纤怎么设置无线路由器?

热门文章

  1. java 浮点数的n次方_java中浮点数表示方式
  2. 【探花交友DAY 06】圈子中的互动功能(点赞、评论、喜欢)
  3. css怎样清除外边距,CSS 外边距
  4. java基础练习题:计算1000以内所有不能被7整除的整数之和
  5. 那些实用有趣的网站,建议低调收藏
  6. pcs+corosync+pacemaker+haproxy负载均衡环境部署
  7. PCoIP vs HDX (CITRIX ICA)远程访问协议对比
  8. 具体芯片的I2C_Adapter驱动分析
  9. 定义一个函数,求一组整数的最大值和最小值。(冒泡法)
  10. 中职计算机基础应用教程ppt,多媒体在中职计算机应用基础教学中的应用