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

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    ubuntu挂载群晖共享文件
    200. 岛屿数量_中等_不再记笔记了
    733. 图像渲染_简单_矩阵
    46. 全排列_中等_模拟
    37. 解数独_困难_矩阵
    1041. 困于环中的机器人_中等_模拟
    946. 验证栈序列
    415. 字符串相加_简单_模拟
    164. 最大间距_数组_困难
    215. 数组中的第K个最大元素_中等_数组
  • 原文地址:https://www.cnblogs.com/javayida/p/13346753.html
Copyright © 2011-2022 走看看