当前位置: 首页 > news >正文

建一个推广网站价格西安电子商务网站开发

建一个推广网站价格,西安电子商务网站开发,个人网站备案涉及支付宝,前端开发可以做网站运营吗背景 今天在开发质量平台时需要获取某些数据#xff0c;要请求公司某个工程的OpenAPI接口A。此接口为返回通用数据的接口#xff0c;且接口本身的RT都在2#xff5e;3秒之间。使用该接口#xff0c;需要进行两次循环获取#xff0c;然后对返回数据进行处理组装#xff0… 背景 今天在开发质量平台时需要获取某些数据要请求公司某个工程的OpenAPI接口A。此接口为返回通用数据的接口且接口本身的RT都在23秒之间。使用该接口需要进行两次循环获取然后对返回数据进行处理组装才能得到我这边工程需要的数据。 在最开始的时候我天真的写了两层循环外层循环为一星期的每一天内层循环为选取的几个版本号。结果发现整个请求过程请求接口B和C获取版本相关数据-两层循环请求接口A-数据过滤筛选-数据组装排序下来响应时间来到了恐怖的2分钟要被领导骂死了 同时数据又都要实时获取无法使用定时任务和缓存的方式 解决思路 将for循环改为多线程的方式进行执行一种常用的方法是使用Executor框架 package com.xxx.xxx;... import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {// 模拟数据库中的100条数据;List list new ArrayList();for (int i 0; i 100; i) {list.add(i);}//Executors创建线程池new固定的10个线程ExecutorService taskExecutor Executors.newCachedThreadPool();final CountDownLatch latch new CountDownLatch(list.size());//用于判断所有的线程是否结束System.out.println(个数 list.size());for (int m 0; m list.size(); m) {final int n m;//内部类里m不能直接用,所以赋值给nRunnable run new Runnable() {public void run() {try {System.out.println(我在执行 n);} finally {latch.countDown(); //每次调用CountDown()计数减1}}};taskExecutor.execute(run);//开启线程执行池中的任务。还有一个方法submit也可以做到它的功能是提交指定的任务去执行并且返回Future对象即执行的结果}try {//等待所有线程执行完毕latch.await();//主程序执行到await()函数会阻塞等待线程的执行直到计数为0} catch (InterruptedException e) {e.printStackTrace();}taskExecutor.shutdown();//关闭线程池//所有线程执行完毕,执行主线程}}注意在使用多线程时需要注意线程安全问题如果程序中使用了共享变量需要进行同步处理。 业务使用 Override public ListJSONObject getBoomCrash(String appId, String androidEventType, String OS, SetString appVersionSet, ListMapString, Long timeScope) throws URISyntaxException, IOException {MapString, String[] versionTagMap new HashMap();// 首先获取版本信息。业务代码省略....// 第一步先获取传入版本所有的crash数据并过滤掉版本首次出现的。业务代码省略ListBoomCrashDataVo boomCrashDataList ...// 第二步获取所有版本和UV【以昨日数据为标准结果是UV倒序排列】。业务代码省略ListCrashVersionUvDataVo versionUvResult ...// 第三步判断当前版本的上一个全量版本。业务代码省略String lastVersion ...List versionList new ArrayList();for (String key : appVersionSet) {versionList.add(key);}versionList.add(lastVersion);String versionListstr StringUtils.join(versionList, ,);ListJSONObject boomCrashDataListNew new ArrayList();// 第四步循环判断获取某个issue数据的数量情况// Executors创建线程池new固定的10个线程ExecutorService taskExecutor Executors.newCachedThreadPool();final CountDownLatch latch new CountDownLatch(boomCrashDataList.size());//用于判断所有的线程是否结束for (BoomCrashDataVo boomCrashData : boomCrashDataList) {Runnable run new Runnable() {public void run() {try {// 这里是业务代码...} finally {latch.countDown(); //每次调用CountDown()计数减1}}};taskExecutor.execute(run);}try {//等待所有线程执行完毕latch.await(); //主程序执行到await()函数会阻塞等待线程的执行直到计数为0} catch (InterruptedException e) {e.printStackTrace();}taskExecutor.shutdown();// 按照TOP进行正序排序Collections.sort(boomCrashDataListNew, new ComparatorJSONObject() {Overridepublic int compare(JSONObject v1, JSONObject v2) {Integer uv1 v1.getIntValue(topNumber);Integer uv2 v2.getIntValue(topNumber);return uv1.compareTo(uv2);}});return boomCrashDataListNew; }改造成果 响应时间降到了2030秒和业务沟通在可接受范围内。同时前端我修改成了在请求数据过程中显示加载组件参考antd的这样就不会显示太过突兀提升用户使用体验。 深入学习 执行器服务 java.util.concurrent.ExecutorService 接口表示一个异步执行机制使我们能够在后台执行任务。因此一个 ExecutorService 很类似于一个线程池。实际上存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现。 ExecutorService executorService Executors.newFixedThreadPool(10);executorService.execute(new Runnable() {public void run() {System.out.println(Asynchronous task);}}); executorService.shutdown();首先使用 newFixedThreadPool() 工厂方法创建一个 ExecutorService。这里创建了一个十个线程执行任务的线程池。然后将一个 Runnable 接口的匿名实现类传递给 execute() 方法。这将导致 ExecutorService 中的某个线程执行该 Runnable。 任务委派 下图说明了一个线程是如何将一个任务委托给一个 ExecutorService 去异步执行的 一旦该线程将任务委派给 ExecutorService该线程将继续它自己的执行独立于该任务的执行。 ExecutorService实现. 既然 ExecutorService 是个接口如果你想用它的话就得去使用它的实现类之一。 java.util.concurrent 包提供了 ExecutorService 接口的以下实现类 ThreadPoolExecutor ScheduledThreadPoolExecutor ExecutorService使用 有几种不同的方式来将任务委托给 ExecutorService 去执行 execute(Runnable)submit(Runnable)submit(Callable)invokeAny(…)invokeAll(…) execute(Runnable) execute(Runnable) 方法要求一个 java.lang.Runnable 对象然后对它进行异步执行。以下是使用 ExecutorService 执行一个 Runnable 的示例 ExecutorService executorService Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() {public void run() {System.out.println(Asynchronous task);} }); executorService.shutdown();没有办法得知被执行的 Runnable 的执行结果。如果有需要的话你得使用一个 Callable(以下将做介绍)。 submit(Runnable) submit(Runnable) 方法也要求一个 Runnable 实现类但它返回一个 Future 对象。这个Future 对象可以用来检查 Runnable 是否已经执行完毕。 以下是 ExecutorService submit() 示例 Future future executorService.submit(new Runnable() {public void run() {System.out.println(Asynchronous task);} }); future.get(); //returns null if the task has finished correctlysubmit(Callable) submit(Callable) 方法类似于 submit(Runnable) 方法除了它所要求的参数类型之外。 Callable 实例除了它的 call() 方法能够返回一个结果之外和一个 Runnable 很相像。 Runnable.run() 不能够返回一个结果。Callable 的结果可以通过 submit(Callable) 方法返回的 Future 对象进行获取。以下是一个 ExecutorService Callable 示例 Future future executorService.submit(new Callable(){public Object call() throws Exception {System.out.println(Asynchronous Callable);return Callable Result;} }); System.out.println(future.get() future.get());// 输出 Asynchronous Callable future.get() Callable ResultinvokeAny() invokeAny() 方法要求一系列的 Callable 或者其子接口的实例对象。调用这个方法并不会返回一个 Future但它返回其中一个 Callable 对象的结果。无法保证返回的是哪个 Callable 的结果 - 只能表明其中一个已执行结束。 如果其中一个任务执行结束(或者抛了一个异常)其他 Callable 将被取消。 以下是示例代码 ExecutorService executorService Executors.newSingleThreadExecutor(); SetCallableString callables new HashSetCallableString(); callables.add(new CallableString() {public String call() throws Exception {return Task 1;} }); callables.add(new CallableString() {public String call() throws Exception {return Task 2;} }); callables.add(new CallableString() {public String call() throws Exception {return Task 3;} }); String result executorService.invokeAny(callables); System.out.println(result result); executorService.shutdown()上述代码将会打印出给定 Callable 集合中的一个的执行结果 invokeAll() invokeAll() 方法将调用你在集合中传给 ExecutorService 的所有 Callable 对象。invokeAll() 返回一系列的 Future 对象通过它们你可以获取每个 Callable 的执行结果。 记住一个任务可能会由于一个异常而结束因此它可能没有 “成功”。无法通过一个 Future 对象来告知我们是两种结束中的哪一种。 以下是一个代码示例 ExecutorService executorService Executors.newSingleThreadExecutor(); SetCallableString callables new HashSetCallableString(); callables.add(new CallableString() {public String call() throws Exception {return Task 1;} }); callables.add(new CallableString() {public String call() throws Exception {return Task 2;} }); callables.add(new CallableString() {public String call() throws Exception {return Task 3;} }); ListFutureString futures executorService.invokeAll(callables); for(FutureString future : futures){System.out.println(future.get future.get()); } executorService.shutdown();ExecutorService关闭 使用完 ExecutorService 之后你应该将其关闭以使其中的线程不再运行。比如如果你的应用是通过一个 main() 方法启动的之后 main 方法退出了你的应用如果你的应用有一个活动的 ExexutorService 它将还会保持运行。ExecutorService 里的活动线程阻止了 JVM 的关闭。 要终止 ExecutorService 里的线程你需要调用 ExecutorService 的 shutdown() 方法。 ExecutorService 并不会立即关闭但它将不再接受新的任务而且一旦所有线程都完成了当前任务的时候ExecutorService 将会关闭。在 shutdown() 被调用之前所有提交给ExecutorService 的任务都被执行。 如果你想要立即关闭 ExecutorService你可以调用 shutdownNow() 方法。这样会立即尝试停止所有执行中的任务并忽略掉那些已提交但尚未开始处理的任务。无法担保执行任务的正确执行。可能它们被停止了也可能已经执行结束。 最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你
http://www.dnsts.com.cn/news/100677.html

相关文章:

  • 通州企业网站建设百度关键词排名批量查询
  • 百度收录好最快的网站赚钱游戏
  • 浙江网站建设广告语做好史志网站建设
  • 西安网站维护 策划网站seo诊断湖南岚鸿
  • 建设网站上海加强局网站建设报告
  • asp net mvc做网站做一个网站加优化排名得多少钱
  • 宁波网站建设怎么做怎么登录已注册的网站
  • 对招聘公司做评价的网站济南润滑油网站制作
  • 网站源码网站重庆品牌网站建设公司哪家好
  • 设计师个人网站架构云南城乡建设厅网站
  • 新闻类网站排版网站建设cms网站下载
  • 案例展示网站南宁做网站推广的公司
  • 如何制作一网站wordpress图片压缩插件
  • 辽阳网站推广张家港做企业网站
  • 郑州新密网站建设设计师导航网站大全
  • 成都有哪些网站开发公司天猫商城网站风格
  • 有了网站怎么做优化洛阳php网站开发
  • 用cms建网站容易吗抖音代刷网站推广快速
  • 中山市规划建设局网站网站建设中山
  • 中国网站建设市场规模石家庄装修公司排名前十强
  • wordpress简单易懂的网站网页设计培训贵不贵
  • 网站建设规划书结构WordPress登录不进
  • 中国建设银行网站查询制作企业网站页面html
  • 淄博网站制作托管优化wordpress 滑动验证
  • 移动互联网网站开发技术想做个网站不知道做什么
  • vi设计网站大全详情页设计逻辑
  • wap网站建设案例乐昌市建设网站
  • 建网站模板成都广告公司
  • 餐饮加盟网站制作下载应用商店app并安装到手机上
  • 怎么做触屏版网站什么叫网站空间