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

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    LoadScript
    Mac终端Terminal调用Sublime Text
    jquery ajax 提交 FormData
    ps切图设置
    bootstrap-select搜索框输入中文
    Homebrew安装
    清空file input框
    javascript 随机数区间
    Canvas与Image互转
    html空格小结
  • 原文地址:https://www.cnblogs.com/javayida/p/13346753.html
Copyright © 2011-2022 走看看