zoukankan      html  css  js  c++  java
  • java 异步

    注:本文基于 jdk1.8

    1. 异步不需要返回值;

    CompletableFuture.runAsync()       

    示例代码如下:

    public JsonResult test() {
          JsonResult result = new JsonResult();
          CompletableFuture.runAsync(() -> {
                // 准备请求
               JsonResult postResult = appTool.postRequest(url, params, headers);
                // 请求结果处理
                if (!postResult.getCode().equals("0")) {
                    // 请求失败
                    logger.error("请求失败");
                }
          }); 
          return result;
    }

    在上述代码中,把一个请求异步执行,方法不必等待post请求结束;

    2.异步需要返回值;

    CompletableFuture.supplyAsync() 

    示例代码如下:

    public String test() {
          CompletableFuture<JsonResult> future = CompletableFuture.supplyAsync(() -> {
                // 准备请求
               JsonResult postResult = appTool.postRequest(url, params, headers);
                return postResult.getCode();
          }); 
          // get() 方法会一直堵塞,直到 feature 完成。result 就是异步结果;此处get() 要用 try-catch 包裹
          String result = feature.get();
          return result;
    }

    3. 等待任意数量异步全部完成

    CompletableFuture.allOf()

    3.1 等待任意数量异步全部完成,不考虑异步结果;

    示例代码如下:

    public String test() {
            List<String> urls = Arrays.asList(...);
            List<CompletableFuture> contentFutures = urls.stream().map(url -> CompletableFuture.runAsync(() -> {
                // 准备请求
                JsonResult postResult = appTool.postRequest(url);
                return postResult.getCode();
            })).collect(Collectors.toList());
    
            CompletableFuture<Void> allFutures = CompletableFuture.allOf(
                contentFutures.toArray(new CompletableFuture[contentFutures.size()])
            );
            // 等待异步全部结束
            allFutures.join();
            return "1";
    }

    此处使用了 join() 来等待异步结束,join() 和 get() 方法类似,区别是

    join() 会抛出 unchecked exception;get() 抛出 checked exception 必须用 try-catch 包裹

    3.2. 等待任意数量异步全部完成,需要异步返回结果;

    示例代码如下:

    public String test() {
            List<String> urls = Arrays.asList(...);
            List<CompletableFuture> contentFutures = urls.stream().map(url -> CompletableFuture.supplyAsync(() -> {
                // 准备请求
                JsonResult postResult = appTool.postRequest(url);
                return postResult.getCode();
            })).collect(Collectors.toList());
    
            CompletableFuture<List<String>> allFutures = CompletableFuture.allOf(
                contentFutures.toArray(new CompletableFuture[contentFutures.size()])
            ).thenApply(v -> {
                return contentFutures.stream().map(contentFuture -> contentFuture.join()).collect(Collectors.toList());
            });
            try {
                // 等待异步并获取返回结果  设置等待时间40s
                List<String> data = allFutureResult.get(40, TimeUnit.SECONDS);
    // "0" 失败 "1" 成功
    return data.indexOf("0") > -1 ? "0" : "1"; } catch (Exception e) { logger.error(e); return "0"; } }

    线程池

    下一篇更新

    参考资料:https://juejin.im/post/5adbf8226fb9a07aac240a67

  • 相关阅读:
    真爱如血第七季/全集True Blood迅雷下载
    真爱如血第一季/全集True Blood迅雷下载
    女子监狱第四季/全集Orange Is the New Black迅雷下载
    女子监狱第一季/全集Orange Is the New Black迅雷下载
    护士当家第一至七季/全集Nurse Jackie迅雷下载
    都铎王朝第一至四季/全集The Tudors迅雷下载
    亿万第一至二季/全集Billions迅雷下载
    超感猎杀/超感八人组第一季至二季/全集Sense8迅雷下载
    双面女间谍第一至五季/全集Alias迅雷下载
    美国罪案故事第一季/全集American Crime Story迅雷下载
  • 原文地址:https://www.cnblogs.com/javencs/p/12091430.html
Copyright © 2011-2022 走看看