在开发中有时客户端一次请求到服务端,服务端需要访问多个服务端(比如B,C,D服务)获取数据。针对这种场景,如果我们每个服务按照顺序调用,会造成整个程序处理时间很长(比如B,C,D服务分别消耗了2秒,整个执行完需要8秒)。这时候我们可以使用多线程同时访问,然后对返回结果进行处理。这里整理了个简单明了的案例(通过线程池和Future)

1. 创建一个线程类MyThread,通过 implements Callable。需要实现call方法,接口调用也会在这里调用(这里用线程等待模拟了下接口访问)

import org.springframework.boot.configurationprocessor.json.JSONObject;
import java.util.concurrent.Callable;public   class MyThread implements Callable<JSONObject> {private String name;private JSONObject parameter;public MyThread(JSONObject parameter, String name) {this.parameter=parameter;this.name=name;}//数据回调public JSONObject call() throws Exception {System.out.println("-------------------------线程"+name+"---等待----2000毫秒-----模拟接口调用消耗的时间(这里可以调用接口传参数parameter)");Thread.sleep(2000);this.parameter.put("returnData","ok");this.parameter.put("threadName",name);return this.parameter;}}

2. 创建执行类 ThreadPoolTest ,详情可以看代码注释

/*** (模拟)线程池,同时访问多个接口*/
public class ThreadPoolTest {@Testpublic void ShiPinThreadHandle() throws Exception {Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();//组合线程请求参数JSONArray parameterArray = new JSONArray();JSONObject a = new JSONObject();a.put("dataType", "1");JSONObject a1 = new JSONObject();a1.put("dataType", "2");JSONObject a2 = new JSONObject();a2.put("dataType", "3");JSONObject a3 = new JSONObject();a3.put("dataType", "4");parameterArray.put(a);parameterArray.put(a1);parameterArray.put(a2);parameterArray.put(a3);//声明线程池ExecutorService exc = Executors.newFixedThreadPool(parameterArray.length());//数据回调处理类集合List<Future<JSONObject>> futures = new ArrayList<>();for (int i = 0; i < parameterArray.length(); i++) {JSONObject singleobje = parameterArray.getJSONObject(i);//申请单个线程执行类MyThread call = new MyThread(singleobje,"线程"+(i+1));//提交单个线程Future<JSONObject> future = exc.submit(call);//将每个线程放入线程集合, 这里如果任何一个线程的执行结果没有回调,线程都会自动堵塞futures.add(future);}//所有线程执行完毕之后会执行下面的循环,然后通过循环每个个线程后执行线程的get()方法每个线程执行的结果for (Future<JSONObject> future : futures) {JSONObject json = future.get();System.out.println(json.getString("threadName")+"------返回结果:"+json.getString("returnData"));}Long milliSecondEnd = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();System.out.println("=======================接口全部调用返回结构总共用时"+(milliSecondEnd-milliSecond)+"毫秒");//关闭线程池exc.shutdown();}
}

3. 执行 ThreadPoolTest 类中的 注解@Test的方法结果:

4. 可以看出来每个接口(模拟的接口请求时长)请求需要2000毫秒,全部接口执行完后,总共使用了2015毫秒。比传统逐个调用接口时间会缩短很多。

5. 此文章只是演示了同时访问多个接口的实现要点,具体使用时需要将延迟2000毫秒的位置替换成自己的接口请求和一些适当的调整。

java同时访问多个接口相关推荐

  1. 几个重要的java数据库访问类和接口

    编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中 ...

  2. java后台访问接口

    java后台访问接口 // 发送url地址获取信息public static String sendPost(String jsonStr, String path) {String msg = &q ...

  3. 使用Java HttpClient访问淘宝Ip查询接口获取具体位置信息

    以前项目中有需要用到过记录客户登入的IP地址,但是并木有具体去查询IP所在的位置, 于是带着好奇心去网上搜索获取IP的详细信息的接口.主要有两个IP查询接口: 1.新浪接口:http://counte ...

  4. java map 教程_Java Map接口

    Java Map接口 在本教程中,我们将学习Java Map接口及其方法. Java collections框架的Map接口提供了Map数据结构的功能. 它实现了Collection接口. map的工 ...

  5. java基础之抽象类和接口

    一.抽象: **抽象类(abstract class):**使用了abstract关键字所修饰的类叫做抽象类.抽象类无法实例化,也就是说,不能new出来一个抽象类的对象(实例). **抽象方法(abs ...

  6. Java私有方法解释_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  7. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  8. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  9. 韩顺平循序渐进学java 第13讲 抽象类.接口

    13.1抽象类 13.1.1 概念 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,称为抽象方法,用abstract来修饰该类,称为抽象类. 13.1.2 抽象类-深入讨论 抽象 ...

最新文章

  1. 华为的鸿蒙系统可以装在电脑上吗_继鸿蒙系统后!华为首款台式机电脑上线:联想PC霸主地位危险了...
  2. python读取excel,数字都是浮点型,日期格式是数字的解决办法
  3. php 过滤微信符号昵称,PHP方法处理微信昵称特殊符号过滤
  4. web性能测试分析-工具篇
  5. 苏宁6亿会员是如何做到精确快速分析的?
  6. java suppresslint_@SuppressLint(NewApi)
  7. lammps计算聚合物例子_LAMMPS中的系综(NPT/NVT)命令
  8. php webwxuploadmedia_PHP Web实现文件上传下载功能实例解析
  9. 一些系统事件的手动触发方法
  10. php登陆页添加记住密码选项,PHP 实现登录记住密码
  11. 多元线性回归模型中多重共线性问题处理方法
  12. [转]使用Hyper-V BPA(Best Practices Analyzer-最佳化分析工具)
  13. 网页浏览器主要通过ftp协议同网页服务器,FTP协议的工具、网页浏览器和命令
  14. 汇编语言王爽实验十三
  15. 关于笔记本测试的面试准备 2021-10-11
  16. 程序员电脑(减少辐射)(¥37)
  17. python 情感分析实例_使用python+机器学习方法进行情感分析(详细步骤)
  18. Python亲戚计算器
  19. excel和matlab交互,Excel与Matlab的数据交互(精选5篇)
  20. 第1章 蓝牙降噪耳机简述

热门文章

  1. `CSS filter` 有哪些神奇用途
  2. 记一次服务器被攻击经历
  3. 简易留言簿系统-ASP.NET MVC (后台基本完成)
  4. java中环境变量设置
  5. 英文版Windows XP的中文支持设置
  6. 字节面试题-小于N的最大数字
  7. GBase 8s灾备集群HAC (三) 主备配置
  8. 施工企业选择智慧工地的有效方法
  9. 在火狐上安装chrome 的crx扩展
  10. c语言日历设计程序框图,C语言课程设计————写下流程图! 谢谢