CompletableFuture的基本用法
admin
2024-02-23 01:11:48
0

目录

    • 前言
    • 使用
      • 完成了就通知我
      • 异步执行任务
      • 流式调用
      • 异常处理
      • 组合多个CompletableFuture
    • 小结

前言

  • CompletableFuture是Java8新增的一个功能十分强大的工具类,它一方面实现了Future接口,另一方面也实现了CompletionStage接口,CompletionStage接口多达40中方法,为我们函数式编程
    流式调用提供支持。相较于FutureTask来做多任务更简洁了。

使用

完成了就通知我

  • 核心代码
/*** 完成了就通知我 ,手动** @return*/public String completeNotify() {CompletableFuture future = new CompletableFuture<>();threadPoolTaskExecutor.execute(new AskThread(future));try {Integer result = future.get();System.out.println("result " + result);return result.toString();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}}class AskThread implements Runnable {CompletableFuture future;public AskThread(CompletableFuture future) {this.future = future;}@Overridepublic void run() {int res = 0;try {// 模拟长时间计算过程Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}res = 100;// 通知完成future.complete(res);}}
  • 之前我利用这个功能完成了 高并发场景下请求合并(批量)
    的功能,可以参考下。

异步执行任务

  • 核心代码
     public String asyncTask() {StopWatch stopWatch = new StopWatch("asyncTask");stopWatch.start("task");// 如果是runAsync 没有返回值CompletableFuture future = CompletableFuture.supplyAsync(() -> calc(50), threadPoolTaskExecutor);CompletableFuture futureTwo = CompletableFuture.supplyAsync(() -> calc(60), threadPoolTaskExecutor);int result = 0;int res = 0;try {result = future.get();res = futureTwo.get();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}System.out.println(result + " " + res);stopWatch.stop();System.out.println(stopWatch.prettyPrint());System.out.println(stopWatch.getLastTaskTimeMillis());return result + " " + res;}public int calc(int param) {try {// 模拟耗时Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if (EXCEPTION_PARAM == param){throw new RuntimeException("传了异常参数 "+param);}return param * 2;}

流式调用

    public String stream() {CompletableFuture future = CompletableFuture.supplyAsync(() -> calc(50), threadPoolTaskExecutor).thenApply((i) -> Integer.toString(i)).thenApply((str) -> "res " + str).thenAccept(System.out::println);try {future.get();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}return "done";}

异常处理

     public String exception() {CompletableFuture future = CompletableFuture.supplyAsync(() -> calc(10)).exceptionally(ex -> {System.out.println("异常信息 " + ex.toString());return 0;}).thenApply((i) -> Integer.toString(i)).thenApply((str) -> "res " + str).thenAccept(System.out::println);try {future.get();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}return "done";}

组合多个CompletableFuture

   public String compose(){CompletableFuture future = CompletableFuture.supplyAsync(()->calc(50),threadPoolTaskExecutor).thenCompose((i)->CompletableFuture.supplyAsync(()->calc(i),threadPoolTaskExecutor)).thenApply((str)->"res " + str).thenAccept(System.out::println);try {future.get();} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}return "done";}

小结

  • CompletableFuture很强大,如果写异步任务相比FutureTask更简洁。
  • 源码地址:https://github.com/1030907690/CompletableFuture-Sample
  • 视频地址:https://www.bilibili.com/video/BV1B24y1C7bT/

相关内容

热门资讯

聪明人有什么特征? 聪明人有什么特征?额头宽阔如果一个人的额头长得特别宽阔的话,这个人就很聪明。我们说宽阔,有两方面的指...
葫芦丝中的低音2. 1和高音的... 葫芦丝中的低音2. 1和高音的7 1 2怎么按?教程里面只有低音3到中音6,我在一些歌曲里面还会出现...
泰坦尼克号主题曲“我心依旧”,... 泰坦尼克号主题曲“我心依旧”,是哪位歌手唱的?Celine Dion席琳·迪翁(席琳狄翁,赛琳迪昂)...
糖果大王杀入谷物界!费列罗31... 财联社7月11日讯(编辑 赵昊)当地时间周四(7月10日),费列罗集团在官网宣布,已同意以每股23美...
九款爆香早餐饼,一口沦陷,唤醒... 清晨,是新的一天的开始,也是唤醒味觉与感官的最佳时刻。在众多早餐选择中,早餐饼以其独特的口感和丰富的...
游离于空间之外,超脱时间之际这... 游离于空间之外,超脱时间之际这句话出自那本书出自于《诗人》
纯白色金丝熊怎么样 纯白色金丝熊怎么样你昌手液好哦别听耐物他们瞎说我家鼠妈妈也生了8只现在15天薯历3只白5只黄白白色是...
女儿做胎毛笔,想要一首藏头诗做... 女儿做胎毛笔,想要一首藏头诗做祝福语,名字叫张雅薇,请大家帮忙想想...女儿做胎毛笔,想要一首藏头诗...
时间过得真快,一转眼又是一年这... 时间过得真快,一转眼又是一年这是夸张句吗?这是一个夸张句,一转眼形容时间过得太快了。这种说法是有点夸...
金沙水拍云崖暖大渡桥横铁索寒表... 金沙水拍云崖暖大渡桥横铁索寒表达了诗人怎样的情感表达了诗人对中国工农红军不畏艰险,英勇顽强的革命英雄...
这是什么电影 女主角叫什么? 这是什么电影 女主角叫什么?不知你说的是什么电影,你应该发些该电影的资料。提问题要表明,不表明就不知...
加勒比海盗戴维琼斯的来历 加勒比海盗戴维琼斯的来历出自加勒比海盗电源 那个章鱼脸
求音乐:只谈心不贪心 求音乐:只谈心不贪心好音乐要看各人的喜好。喜好不同,听的音乐也不同。我喜欢的不一定你喜欢~~~
张常宁爸爸个人资料 张常宁爸爸个人资料 张常宁的爸爸名叫张友生。张友生:1958年出生。上世纪八十年代的老排球国手,...
长投学堂小熊之家老师好吗? 长投学堂小熊之家老师好吗?你好,我觉得很不错,老师很尽职,可以学到很多据我所知,他很不错,身为创始人...
镇关西 是什么意思? 镇关西 是什么意思?郑屠为何叫镇关西呢?有什么含义混号,用现在的话说就是绰号,说明他在这一带很霸道,...
如果我们真心相爱 最后我们会在... 如果我们真心相爱 最后我们会在一起吗?爱情这个东西并不是万能的,男女有了爱就够了吗?在绝对真实的感情...
身无彩凤双飞翼,下一句是什么? 身无彩凤双飞翼,下一句是什么?下一句是:心有灵犀一点通。全文如下:无题[ 唐 ] 李商隐原文 译文对...
中国一年中,共有多少个传统节日... 中国一年中,共有多少个传统节日?中国传统节日一年共有11个,分别是:春节、元宵、寒食、清明、端午、七...
文具盲盒引起学生过度消费,盲盒... 文具盲盒引起学生过度消费,盲盒是套路还是惊喜?我觉得如果是因为要买盲盒而过度消费就是不理智的举动,在...