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,如果是异常,那么异常就带过来了…

posted @ 2020-05-10 19:11  你就像甜甜的益达  阅读(465)  评论(0编辑  收藏  举报