java同时访问多个接口
在开发中有时客户端一次请求到服务端,服务端需要访问多个服务端(比如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同时访问多个接口相关推荐
- 几个重要的java数据库访问类和接口
编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中 ...
- java后台访问接口
java后台访问接口 // 发送url地址获取信息public static String sendPost(String jsonStr, String path) {String msg = &q ...
- 使用Java HttpClient访问淘宝Ip查询接口获取具体位置信息
以前项目中有需要用到过记录客户登入的IP地址,但是并木有具体去查询IP所在的位置, 于是带着好奇心去网上搜索获取IP的详细信息的接口.主要有两个IP查询接口: 1.新浪接口:http://counte ...
- java map 教程_Java Map接口
Java Map接口 在本教程中,我们将学习Java Map接口及其方法. Java collections框架的Map接口提供了Map数据结构的功能. 它实现了Collection接口. map的工 ...
- java基础之抽象类和接口
一.抽象: **抽象类(abstract class):**使用了abstract关键字所修饰的类叫做抽象类.抽象类无法实例化,也就是说,不能new出来一个抽象类的对象(实例). **抽象方法(abs ...
- Java私有方法解释_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...
- 3、java基础:抽象类与接口的区别
抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...
- 韩顺平循序渐进学java 第13讲 抽象类.接口
13.1抽象类 13.1.1 概念 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,称为抽象方法,用abstract来修饰该类,称为抽象类. 13.1.2 抽象类-深入讨论 抽象 ...
最新文章
- 华为的鸿蒙系统可以装在电脑上吗_继鸿蒙系统后!华为首款台式机电脑上线:联想PC霸主地位危险了...
- python读取excel,数字都是浮点型,日期格式是数字的解决办法
- php 过滤微信符号昵称,PHP方法处理微信昵称特殊符号过滤
- web性能测试分析-工具篇
- 苏宁6亿会员是如何做到精确快速分析的?
- java suppresslint_@SuppressLint(NewApi)
- lammps计算聚合物例子_LAMMPS中的系综(NPT/NVT)命令
- php webwxuploadmedia_PHP Web实现文件上传下载功能实例解析
- 一些系统事件的手动触发方法
- php登陆页添加记住密码选项,PHP 实现登录记住密码
- 多元线性回归模型中多重共线性问题处理方法
- [转]使用Hyper-V BPA(Best Practices Analyzer-最佳化分析工具)
- 网页浏览器主要通过ftp协议同网页服务器,FTP协议的工具、网页浏览器和命令
- 汇编语言王爽实验十三
- 关于笔记本测试的面试准备 2021-10-11
- 程序员电脑(减少辐射)(¥37)
- python 情感分析实例_使用python+机器学习方法进行情感分析(详细步骤)
- Python亲戚计算器
- excel和matlab交互,Excel与Matlab的数据交互(精选5篇)
- 第1章 蓝牙降噪耳机简述