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

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    trackr: An AngularJS app with a Java 8 backend – Part III
    trackr: An AngularJS app with a Java 8 backend – Part II
    21. Wireless tools (无线工具 5个)
    20. Web proxies (网页代理 4个)
    19. Rootkit detectors (隐形工具包检测器 5个)
    18. Fuzzers (模糊测试器 4个)
    16. Antimalware (反病毒 3个)
    17. Debuggers (调试器 5个)
    15. Password auditing (密码审核 12个)
    14. Encryption tools (加密工具 8个)
  • 原文地址:https://www.cnblogs.com/javayida/p/13346753.html
Copyright © 2011-2022 走看看