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/

相关内容

热门资讯

少年音乐和美术故事的简介 少年音乐和美术故事的简介要简单一点,一两百字左右,马上要,快 少年美术音乐故事》是父亲丰子恺创作...
邻人烹鸡的故事告诉我们什么道理 邻人烹鸡的故事告诉我们什么道理具体的道理,不应发言时发言,应该发言时沉默,都不是好事,会招来灾祸。 ...
"鬼迷心窍"... "鬼迷心窍"与一部老电视剧:是新加坡的电视剧叫情丝万缕,这也是我小时候的回忆啊!
求一个系列的古代小说;女主角四... 求一个系列的古代小说;女主角四姐妹,是公主,都来至月眠国,嫁给四个方向上四国的王。月眠国的四位公主
有哪些女性的故事? 有哪些女性的故事?1. 有一位女士的母亲患有癌症,她坚持照顾母亲,不顾自己的工作和生活,全身心地照顾...
感动中国学生的100个幽默故事... 感动中国学生的100个幽默故事的介绍 面对挫折时,改变一种态度,你可能就将拥有全新的一切。幽默就是一...
《沧海一声笑》好听不? 《沧海一声笑》好听不?个人认为好听经典,由被称作鬼才的黄沾作词曲蛮好听的,适合纯古筝风挺好听的 没听...
任何解释“南海水有鲛人,水居如... 任何解释“南海水有鲛人,水居如鱼,不废织绩,其眼能泣珠”中的“不废织绩”不停地纺织着.
我喜欢邻桌男生,怎么让他喜欢我... 我喜欢邻桌男生,怎么让他喜欢我?气质 你有气质的话 会另人特别的注意你再来毕业的隔天基本上班级都会聚...
艺术教育在当代社会生活中的重要... 艺术教育在当代社会生活中的重要意义是什么艺术教育在当代社会生活中的重要意义是什么从广义上讲,“艺术教...
《海贼王》剧场版共有几个? 《海贼王》剧场版共有几个?名字分别是什么?有七个吧,上面有,呵呵
OSI开放系统模型包括几个层次... OSI开放系统模型包括几个层次,都是什么?OSI开放系统模型包括几个层次,都是什么?OSI的七层分别...
准备作文材料,有关梦想,写出故... 准备作文材料,有关梦想,写出故事名称,分几步写,每一步写什么,给每个故事写一个优美的小标题?如:成长...
魔术师怎么会飞 魔术师怎么会飞魔术师怎么会飞因为他能飞。因为他有梦想因为他是魔术师那是想象中的东西!!不可能会飞的啊...
去了一趟上海,尽管我心里有所准... “世界那么大,我想去看看。”这句文艺范儿十足的话,其实说出了无数颗想要闯荡江湖、浪迹天涯的心。我也不...
文化中国行 | 苏州拙政园:竹... 本报苏州7月8日电(中青报·中青网记者 李超 见习记者 张仟煜)记者今天从苏州拙政园管理处获悉,该园...
梅花易数在风水中的运用 梅花易数在风水中的运用我给你举列子八卦 对应的就是 6亲与方位与吉凶这就是风水
求一些有意义的的广告词,随便哪... 求一些有意义的的广告词,随便哪方面都可以!有了神舟还需要联想吗?我觉得太平洋保险的很好:平日汇聚一滴...
读了七彩虾一文,你觉得可以为老... 读了七彩虾一文,你觉得可以为老年人做些什么事情呢?读了七彩虾一文,你觉得可以为老年人做些什么事情呢?...
一年级学了姓氏歌学到了什么 一年级学了姓氏歌学到了什么更加深入的了解了中国传统文化培养了热爱祖国的真挚情感,姓氏歌让我对中国很多...