1、前置

我现在有这么个要求, 调用外部的一个接口, 需要调用5次, 并且拿到5次请求返回数据, 分析结果
JDK:1.8

2、实现代码

@RequestMapping(value = "/createOrder", method = RequestMethod.GET)
@ResponseBody
public CommonResult createOrder(@RequestParam(value = "code", required = true) String code
) throws InterruptedException {Thread.sleep(2000);int i = Integer.parseInt(code) % 2;if (i == 0) {return CommonResult.success("SUCCESS", code);}return CommonResult.failMessage(500, "FAIL", code);
}
import com.alibaba.fastjson.JSONObject;
import com.chaim.common.utils.http.HttpUtils;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiConsumer;/*** @author Chaim* @date 2021/8/23 23:16*/
@Slf4j
public class TestHttpUtil {public static void main(String[] args) {//        for (int i = 0; i < 40; i++) {//            asynchronousRequest();
//        }
//        asynchronousRequest();syncRequest();}/*** 异步执行*/public static void asynchronousRequest() {long starTime = System.currentTimeMillis();List<CompletableFuture> comlist = new ArrayList<>();final List<String> stringListSuccess = new CopyOnWriteArrayList<>();final List<String> stringListFail = new CopyOnWriteArrayList<>();for (int i = 0; i < 5; i++) {int finalI = i;// CompletableFuture.supplyAsync: 返回一个新的CompletableFuture,由给定执行器中运行的任务异步完成,并通过调用给定的供应商获得的值。CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 执行具体逻辑 try {return HttpUtils.sendGet("http://127.0.0.1:8080/tomorrow/paypal/createOrder", "code=" + finalI);} catch (Exception e) {e.printStackTrace();}return "";// .whenCompleteAsync: 返回一个与此阶段相同结果或异常的新CompletionStage,当此阶段完成时,执行给定操作将使用此阶段的默认异步执行工具执行给定操作,结果(或 null如果没有))和异常(或 null如果没有)这个阶段作为参数。}).whenCompleteAsync(new BiConsumer<String, Throwable>() {@Overridepublic void accept(String s, Throwable throwable) {JSONObject requestParams = JSONObject.parseObject(s);if ("200".equals(requestParams.getString("code"))) {stringListSuccess.add(requestParams.getString("data"));} else {stringListFail.add(requestParams.getString("data"));}}});comlist.add(future);}// allOf: 返回一个新的CompletableFuture,当所有给定的CompletableFutures完成时,完成。CompletableFuture<Void> all = CompletableFuture.allOf(comlist.toArray(new CompletableFuture[5]));// 完成后返回结果值,如果完成异常,则返回(未检查)异常。all.join();System.out.println("stringListSuccess:   " + stringListSuccess);System.out.println("stringListFail:      " + stringListFail);long endTime = System.currentTimeMillis();System.out.println("StringBuffer的append用时:" + ((endTime - starTime) / 1000) + "秒");}/*** 同步执行*/public static void syncRequest() {long starTime = System.currentTimeMillis();List<String> stringListSuccess = new ArrayList<>();List<String> stringListFail = new ArrayList<>();for (int i = 0; i < 5; i++) {String string = HttpUtils.sendGet("http://127.0.0.1:8080/tomorrow/paypal/createOrder", "code=" + i);JSONObject requestParams = JSONObject.parseObject(string);if ("200".equals(requestParams.getString("code"))) {stringListSuccess.add(requestParams.getString("data"));} else {stringListFail.add(requestParams.getString("data"));}}log.info("stringListSuccess: {}", stringListSuccess);log.info("stringListFail: {}", stringListFail);long endTime = System.currentTimeMillis();System.out.println("StringBuffer的append用时:" + ((endTime - starTime) / 1000) + "秒");}
}

3、打印截图

异步执行结果

asynchronousRequest:

同步执行结果

4、备注

1、从截图中我们可以看出, 同步执行所需要的时间为10秒钟, 而异步执行的时间只需要2秒钟, 可以为我们节省8秒钟的时间, 这个时间不算短了

2、CompletableFuture是JDK1.8的特性, 具体内容可参考JDK1.8的文档中文文档: https://www.matools.com/api/java8

java 异步请求completablefuture相关推荐

  1. java异步请求显示数据格式_JSON(四)——异步请求中前后端使用Json格式的数据进行交互...

    json格式的数据广泛应用于异步请求中前后端的数据交互,本文主要介绍几种使用场景和使用方法. 一,json格式字符串 functionsentAjax(){ $.ajax({ type:'POST', ...

  2. java 异步请求重定向_JavaEE通过response实现请求重定向

    请求重定向指的是一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向.302状态码和location头即可实现重定向. 请求重定向最常见的应用场景就是用户登录. 下面 ...

  3. Spring及Springboot 异步请求

    1.java 异步请求 Spring在3.2的版本上就已经为我们提供的相应的机制,以应对Http Nio的场景. 官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基 ...

  4. 【转载】Java 8 的异步编程 CompletableFuture

    文章目录 一个例子回顾 Future 一个例子走进CompletableFuture CompletableFuture使用场景 创建异步任务 supplyAsync方法 runAsync方法 任务异 ...

  5. java异步处理_SpringBoot异步开发之异步请求,在高并发的情况下,提高性能

    何为异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果一个请求需要进行IO操作,比如 ...

  6. java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...

    轻量级网络请求框架MyHttputils 一.前言 本版代码大换血,使用了策略模式和构造模式来组织代码,增加了更加人性化的请求构造,代码质量提高.效率显著提升.(但是使用风格基本没变哦) 2.0.2版 ...

  7. java httpclient 异步请求_java_java实现HttpClient异步请求资源的方法,本文实例讲述了java实现HttpClien - phpStudy...

    java实现HttpClient异步请求资源的方法 本文实例讲述了java实现HttpClient异步请求资源的方法.分享给大家供大家参考.具体实现方法如下: package demo; import ...

  8. java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求

    Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...

  9. JAVA中.jsp模板文件AJAX异步请求 - 数据渲染问题

    JAVA中.jsp模板文件AJAX异步请求 - 数据渲染失败,谁的过失? 后端已经查询出来结果,但是返回的API接口response查看不到对应的信息.(即:后台有,前台没有) 原因分析: 是因为AJ ...

最新文章

  1. 基于级联FFT的广义互相关算法在声源定位中的应用
  2. esp32-cam的原理图
  3. 怎么选择网管型和非网管型交换机
  4. c++ 数组的数据保存二进制_Redis五种不同的数据类型
  5. 《新一代人工智能发展白皮书(2017年)》重磅发布(100页完整版PPT)
  6. oracle异步sql,Linux上Oracle是否使用异步io的诊断
  7. C++---基于ffmpeg实现视频播放器(一)
  8. 中国喷漆室保护膜市场趋势报告、技术动态创新及市场预测
  9. MySQL 查询连接数并显示完整的processlist中info信息
  10. P3223 [HNOI2012]排队
  11. NVMe驱动详解系列_第一部:NVMe驱动初始化与注销
  12. B端产品经理基本介绍
  13. 解决Ubuntu下任务栏不显示任务的问题
  14. 到底要不要去外包公司?这篇带你全面了解外包那些坑!
  15. LeetCode #1056. Confusing Number
  16. IDO老徐:关于简历、关于面试,说几点感悟、给几点建议
  17. 汇编移位指令SHR,SAR,SAL/SHL,ROR,ROL,RCR,RCL
  18. java格式化XML文件
  19. 图像识别,ocr 技术,有兴趣的可以了解一下
  20. 大学计算机软件专业生应该学什么

热门文章

  1. 知识竞赛主持人一定要看的主持宝典
  2. 【转】从零开始React服务器渲染
  3. linux信息安全_SSL,PKI,CA篇
  4. IT新型态:十年一遇的变革
  5. AirPower的无线充电板
  6. 笔记:android TV开发 长按 连续快进, 长按结束停止快进
  7. 编写计算整个二叉树高度的算法(二叉树的高度也叫二叉树的深度)。
  8. 经常骑摩托车的朋友们,你们的iPhone还好吗?
  9. win10计算机本地连接属性在哪里,Win10怎么打开本地连接属性_Win10打开本地连接属性教程-192路由网...
  10. AI绘图工具能取代设计师吗?