CompleteFuture实现简单的任务编排实践 (2)

无关性任务,互相依赖,allOf

CompletableFuture<String> f3 = CompletableFuture.supplyAsync(() -> "hello"); CompletableFuture<String> f4 = CompletableFuture.supplyAsync(() -> "world"); CompletableFuture<String> f5 = CompletableFuture.supplyAsync( () -> { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return "!"; }); // 使用allOf方法 f3 f4 f5 都执行结束之前一直阻塞 CompletableFuture.allOf(f3, f4, f5).join(); System.out.println(f3.get()); System.out.println(f4.get()); System.out.println(f5.get()); List<String> r = Stream.of(f3, f4, f5).map(CompletableFuture::join).collect(Collectors.toList()); System.out.println(r); // 执行结果:hello // world // ! // [hello, world, !] // 而且要等f1,f2,f3 三个任务都结束,不然会一直阻塞。

这个类中的大部分方法上面都做了介绍,下面可以结合具体场景做一次演示。

三:DEMO

​ 场景1:需要查询一个订单信息,首先需要查询商品信息,然后查询支付信息,最后汇总成一个对象返回。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "商品信息") .thenCombineAsync(CompletableFuture.supplyAsync(() -> "支付信息"), (a, b) -> { // 组装信息 return a + b; }); log.info("ret =========>{}",future.get());

​ 场景2:用户注册,首先需要校验用户信息,然后生成账号信息,最后保存到数据库。这三个操作互相依赖。

// A -> B-> C CompletableFuture<String> future = CompletableFuture.runAsync(() -> { if (ThreadLocalRandom.current().nextBoolean()){ return; } throw new RuntimeException("该手机号码已经注册"); }).thenCompose(ret -> CompletableFuture.supplyAsync(() -> { if (ThreadLocalRandom.current().nextBoolean()) { // 生成账号信息 return "账号信息: 16289"; } throw new RuntimeException("账号信息生成失败。。"); })).thenApplyAsync(ret -> { // 保存账号信息 log.info("保存账号信息->{}", ret); return "注册成功"; }).exceptionally(e -> "注册失败" + e.getMessage()); log.info("最终返回结果:===》 {}",future.get());

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwyxxy.html