南山网站公司,百度seo关键词报价,龙岗网站建设_公司推广,下面有关网络营销特点的论述正确的有文章目录 一. 两个异步任务的合并#xff1a;泡茶喝水二. 复杂的异步调用#xff1a;结果依赖#xff0c;以及异步执行调用等 一. 两个异步任务的合并#xff1a;泡茶喝水
下面的代码中我们实现泡茶喝水。这里分3个任务#xff1a;任务1负责洗水壶、烧开水#xff0c;任… 文章目录 一. 两个异步任务的合并泡茶喝水二. 复杂的异步调用结果依赖以及异步执行调用等 一. 两个异步任务的合并泡茶喝水
下面的代码中我们实现泡茶喝水。这里分3个任务任务1负责洗水壶、烧开水任务2负责洗茶壶、洗茶杯和拿茶叶任务3负责泡茶。其中任务3要等待任务1和任务2都完成后才能开始。
public class DrinkTea {private static final int SLEEP_GAP 3;//等待3秒public static void main(String[] args) {// 异步任务1CompletableFutureBoolean washJob CompletableFuture.supplyAsync(() -{Print.tcfo(洗茶杯);//线程睡眠一段时间代表清洗中sleepSeconds(SLEEP_GAP);Print.tcfo(洗完了);return true;});// 异步任务2CompletableFutureBoolean hotJob CompletableFuture.supplyAsync(() -{Print.tcfo(洗好水壶);Print.tcfo(烧开水);//线程睡眠一段时间代表烧水中sleepSeconds(SLEEP_GAP);Print.tcfo(水开了);return true;});// 等待任务12执行完成后任务3执行thenCombineCompletableFutureString drinkJob //hotOk、washOK指的是两个异步任务的返回结果washJob.thenCombine(hotJob, (hotOk, washOK) -{if (hotOk washOK) {Print.tcfo(泡茶喝茶喝完);return 茶喝完了;}return 没有喝到茶;});// 阻塞主线程等待任务 3 执行结果Print.tco(drinkJob.join());}执行日志
[ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$0]洗茶杯
[ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]洗好水壶
[ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]烧开水
[ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$0]洗完了
[ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]水开了
[ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$2]泡茶喝茶喝完
[main]茶喝完了
JVM退出钩子(定时和顺序任务线程池) starting....
JVM退出钩子(定时和顺序任务线程池) 耗时(ms): 1通过整体的执行过程可以发现
给任务分配线程的工作由线程池自动完成。任务之间的依赖关系一目了然。以下面的伪代码为例 job3 job1.thenCombine( job2, (result1, result2)-{回调逻辑})等待任务12执行完成后任务3执行thenCombine其中result1、result2是任务1、任务2的返回值。基于两个异步任务的返回值判断是否进行泡茶喝。
join 阻塞主线程等待任务 3 执行结果
参考《Java高并发核心编程》-尼恩 二. 复杂的异步调用结果依赖以及异步执行调用等
具体代码查看gitee提交[并发编程]CompletableFuture实现复杂的异步调用结果依赖以及异步执行调用等
具体实现了 通过策略模式实现了流程下各个执行逻辑通过使用CompletableFuture实现各执行逻辑异步执行通过使用thenRunAsync等待前面步骤执行进而实现5,6步的异步执行加快执行速度使用CompletableFuture.allOf(step5, step6)合并5,6步的结果。