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

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    OpenCascade Ray Tracing Rendering
    Create New Commands in Tcl
    OpenCascade Modeling Algorithms Fillets and Chamfers
    OpenCascade Modeling Algorithms Boolean Operations
    Construction of Primitives in Open Cascade
    Open Cascade Data Exchange STL
    Tcl Tk Introduction
    Open Cascade DataExchange IGES
    Netgen mesh library : nglib
    Hello Netgen
  • 原文地址:https://www.cnblogs.com/javayida/p/13346753.html
Copyright © 2011-2022 走看看