zoukankan      html  css  js  c++  java
  • CompletableFuture多任务组合

    简介

    上一篇写了CompletableFuture的一些常用方法,今天看看CompletableFuture的一些不是很常用的方法,至少我是不常用…接着上篇讲,上篇最后我记得提过allof,和anyof方法

    allof,anyof方法

    allof顾名思义,就是所有的任务执行完成后返回future,
    anyif就是只要有一个任务执行完成后就返回future并将第一个完成的参数带着一起返回,
    代码:

     @Test
      public void allOfTest1() throws Exception {
        CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
          try {
            TimeUnit.SECONDS.sleep(3);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          return "f1";
        });
    
        CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
          try {
            TimeUnit.SECONDS.sleep(2);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
    //      throw new RuntimeException("aa");
          return "f2";
        });
    
        CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2).thenApply(x -> {
          System.out.println("all");
          return null;
        });
    
        //阻塞,直到所有任务结束。任务complete就会执行,handler里面不一定会执行..
        System.out.println(System.currentTimeMillis() + ":阻塞");
        //join 或者get
        Void aVoid = all.get();
        System.out.println(System.currentTimeMillis() + ":阻塞结束");
    
        //一个需要耗时2秒,一个需要耗时3秒,只有当最长的耗时3秒的完成后,才会结束。
        System.out.println("任务均已完成。");
      }
    

    执行结果:
    在这里插入图片描述
    如果异常也是直接报错.
    在这里插入图片描述
    如果想处理异常,可以直接处理,可以通过whencomplete,handler方法…

    anyof

    同理,直接上代码;

     @Test
      public void anyOfTest() throws Exception {
        CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
          try {
            TimeUnit.SECONDS.sleep(3);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          return "f1";
        });
    
        CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
          try {
            TimeUnit.SECONDS.sleep(2);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
    //      throw new RuntimeException("aa");
          return "f2";
        });
        CompletableFuture<Object> anyof = CompletableFuture.anyOf(f1, f2).handle((x, y) -> {
          System.out.println(x);
          return x;
        });;
    
        //阻塞,直到所有任务结束。任务complete就会执行,handler里面不一定会执行..
        anyof.get();
        //一个需要耗时2秒,一个需要耗时3秒,只有当最长的耗时3秒的完成后,才会结束。
        System.out.println("任务均已完成。");
    
      }
    

    返回结果:
    在这里插入图片描述
    如果是f1先返回那参数就是f1,如果是异常,那么异常就带过来了…

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    关于软件工程是不是教那些不会写程序的人开发软件的一些看法。
    学习这门课的一些问题
    软件测试的平台
    课程上不明白的问题
    目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?
    自我介绍
    【软件工程】提问回顾与个人总结
    Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解
    elasticsearch-py 解决 too_long_frame_exception 问题
    Redis集群学习笔记
  • 原文地址:https://www.cnblogs.com/javayida/p/13346753.html
Copyright © 2011-2022 走看看