本人开发的开发者技术变现资源聚集地,大家支持下,下面是网址

https://www.baiydu.com

一、主要使用类

. ExecutorService

java线程池类

申明方式:ExecutorService exc = Executors.newFixedThreadPool(requestParameterArray.length());

参数:requestParameterArray.length()是请求线程的总数量,其中每一个成员存放单个线程所需参数。

代码:

.Future

Future是一个接口,他提供给了我们方法来检测当前的任务是否已经结束,还可以等待任务结束并且拿到一个结果,通过调用Future的get()方法可以当任务结束后返回一个结果值,如果线程里的任何一个线程工作没有结束,则线程会自动阻塞,直到任务执行完毕,我们可以通过调用cancel()方法来停止一个任务,如果任务已经停止,则cancel()方法会返回true;如果任务已经完成或者已经停止了或者这个任务无法停止,则cancel()会返回一个false。当一个任务被成功停止后,他无法再次执行。isDone()和isCancel()方法可以判断当前工作是否完成和是否取消,他的作用通过callable的回调获得我们请求的结果。

ExecutorService/Future的执行代码类

  1. public class AAAThreadHttpRequest
  2. {
  3.  
  4. //首页返回所需的参数和接口,电影接口
  5. //热门电影
  6. private String hotfilmUrl = "http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=1&limit=30&sr=1";
  7. //热门电视剧
  8. private String hotdianshijuUrl = "http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=2&limit=5&sr=2";
  9. //热门动漫
  10. private String hotanimationUrl = "http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=4&limit=5&sr=3";
  11. //第一个分段数据
  12. private String segmentOneUrl ="http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=7&limit=6&sr=5";
  13.  
  14. //淘宝客
  15.  
  16. public LinkedList<JSONObject> ShiPinThreadHandle() throws JSONException, IOException, InterruptedException, ExecutionException
  17. {
  18. //组合线程请求参数
  19. JSONArray requestParameterArray=new JSONArray();
  20. JSONObject a=new JSONObject();
  21. a.put("requestUrl", hotfilmUrl);
  22. a.put("dataType", "hotFilm");
  23. a.put("type", "shipin");
  24.  
  25. JSONObject a1=new JSONObject();
  26. a1.put("requestUrl", hotdianshijuUrl);
  27. a1.put("dataType", "hotDianshiju");
  28. a1.put("type", "shipin");
  29.  
  30. JSONObject a2=new JSONObject();
  31. a2.put("requestUrl", hotanimationUrl);
  32. a2.put("dataType", "hotDongman");
  33. a2.put("type", "shipin");
  34.  
  35. JSONObject a3=new JSONObject();
  36. a3.put("requestUrl", segmentOneUrl);
  37. a3.put("dataType", "firstSegmentData");
  38. a3.put("type", "shipin");
  39.  
  40. requestParameterArray.put(a);
  41. requestParameterArray.put(a1);
  42. requestParameterArray.put(a2);
  43. requestParameterArray.put(a3);
  44.  
  45. //申明线程池
  46. ExecutorService exc = Executors.newFixedThreadPool(requestParameterArray.length());
  47. //申明数据回调处理类List<Future<JSONObject>>
  48. List<Future<JSONObject>> futures = new ArrayList<Future< JSONObject>>();
  49. for (int i =0; i < requestParameterArray.length(); i++) {
  50.  
  51. JSONObject singleobje=requestParameterArray.getJSONObject(i);
  52. //申请单个线程执行类
  53. ShiPinThreadHandleRequest call =new ShiPinThreadHandleRequest(singleobje);
  54. //提交单个线程
  55. Future< JSONObject> future = exc.submit(call);
  56. //将每个线程放入线程集合, 这里如果任何一个线程的执行结果没有回调,线程都会自动堵塞
  57. futures.add(future);
  58.  
  59. }
  60. //所有线程执行完毕之后会执行下面的循环,然后通过循环每个个线程后执行线程的get()方法每个线程执行的结果
  61. for (Future< JSONObject> future : futures) {
  62.  
  63. JSONObject json= future.get();
  64.  
  65. AAAANewAppShareSingleton.getInstance().homePageSessionDictionary.put(json.getString("dataType"), json.getJSONArray("returnData"));
  66.  
  67. }
  68. AAAANewAppShareSingleton.getInstance().homeIsOrNoReturn=1;
  69.  
  70. //关闭线程池
  71. exc.shutdown();
  72.  
  73. //这里由于我直接将返回结果放入到单利中缓存了,所有返回null
  74. return null;
  75.  
  76. }

.Callable

线程执行者,我们的数据将在这个类的构造函数里面执行,这个类自带了回调函数。当执行结果返回时会通过它自带的回调将请求结果反馈给Future。

Callable执行代码类

  1. public class ShiPinThreadHandleRequest implements Callable<JSONObject> {
  2.  
  3. private JSONObject parameter;
  4.  
  5. public ShiPinThreadHandleRequest(JSONObject parameter) throws JSONException, IOException {
  6. this.parameter=parameter;
  7.  
  8. try
  9. {
  10.  
  11. String HtmlJson=httpGetRequest(this.parameter.getString("requestUrl"));
  12. JSONObject object=new JSONObject(HtmlJson);
  13. //请求的爱奇艺接口
  14. if(this.parameter.get("type").equals("shipin"))
  15. {
  16. JSONArray returnArray=object.getJSONArray("data");
  17.  
  18. if(this.parameter.getString("dataType").equals("firstSegmentData"))
  19. {
  20.  
  21. JSONArray againArray=new JSONArray();
  22. for (int j=0;j<returnArray.length();j++)
  23. {
  24. JSONArray tempArrray=new JSONArray();
  25. tempArrray.put(returnArray.getJSONObject(j));
  26. tempArrray.put(returnArray.getJSONObject(j+1));
  27.  
  28. againArray.put(tempArrray);
  29. j=j+1;
  30.  
  31. }
  32. this.parameter.put("returnData",againArray);
  33. }
  34. else
  35. {
  36. this.parameter.put("returnData",returnArray);
  37. }
  38.  
  39. }
  40. //请求的淘宝客接口
  41. else
  42. {
  43.  
  44. }
  45.  
  46. }
  47. catch(Exception e)
  48. {
  49.  
  50. }
  51.  
  52. }
  53.  
  54. //数据回调
  55. public JSONObject call() throws Exception {
  56.  
  57. return this.parameter;
  58. }
  59. }

4.http请求方法

  1. public String httpGetRequest(String urlString1) {
  2.  
  3. String result = "";
  4. BufferedReader in = null;
  5.  
  6. try {
  7.  
  8. URL realUrl = new URL(urlString1);
  9. // 打开和URL之间的连接
  10. URLConnection connection = realUrl.openConnection();
  11. // 设置通用的请求属性
  12. connection.setRequestProperty("accept", "*/*");
  13. connection.setRequestProperty("connection", "Keep-Alive");
  14. connection.setRequestProperty("user-agent",
  15. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  16. // 建立实际的连接
  17. connection.connect();
  18. // 获取所有响应头字段
  19. Map<String, List<String>> map = connection.getHeaderFields();
  20. // 遍历所有的响应头字段
  21. for (String key : map.keySet()) {
  22.  
  23. }
  24. // 定义 BufferedReader输入流来读取URL的响应
  25. in = new BufferedReader(new InputStreamReader(
  26. connection.getInputStream()));
  27. String line;
  28. while ((line = in.readLine()) != null) {
  29. result += line;
  30. }
  31. } catch (Exception e) {
  32. System.out.println("发送GET请求出现异常!" + e);
  33. e.printStackTrace();
  34. }
  35. // 使用finally块来关闭输入流
  36. finally {
  37. try {
  38. if (in != null) {
  39. in.close();
  40. }
  41. } catch (Exception e2) {
  42. e2.printStackTrace();
  43. }
  44. }
  45. return result;
  46.  
  47. }

二、适合的使用场景

复杂的网页爬虫,如要同时请求多个不同网页的数据,并且需要执行不同的数据处理,这个是非常合适的,执行线程传递的参数到最后callback是会附带一起反馈,你可以根据请求时的附带的类型参数进行判断。 复杂的首页数据,同时需要请求不同数据库的不同接口。

三、优势

解决了多线程中复杂的线程堵塞问题,因为有future,它已经给你做了所有的事。

 

本人创业做的一款androidApp, 下载量已经有2000多万,各种当前热门的网络手机奖励红包全部集成,另外还有热门电影和淘宝高额优惠券!很适合各类型的用户。

 

java异步线程池同时请求多个接口数据的更多相关文章

  1. iOS开发之线程组解决请求多个接口数据,完成后,再刷新界面

    1.多任务请求接口,完成后,在刷新数据,常用方法 2018年07月18日 16:34:38 hbblzjy 阅读数:1382 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  2. java多线程——线程池源码分析(一)

    本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 通常应用多线程技术时,我们并不会直接创建一个线程,因为系统启动一个新线程的成本是比较高的,涉及与操作系统的交互, ...

  3. 深入理解Java之线程池(爱奇艺面试)

    爱奇艺的面试官问 (1) 线程池是如何关闭的 (2) 如何确定线程池的数量 一.线程池销毁,停止线程池 ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown() ...

  4. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

  5. 使用C++11 开发一个半同步半异步线程池

    摘自:<深入应用C++11>第九章 实际中,主要有两种方法处理大量的并发任务,一种是一个请求由系统产生一个相应的处理请求的线程(一对一) 另外一种是系统预先生成一些用于处理请求的进程,当请 ...

  6. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  7. 使用C++11实现一个半同步半异步线程池

    前言 C++11之前我们使用线程需要系统提供API.posix线程库或者使用boost提供的线程库,C++11后就加入了跨平台的线程类std::thread,线程同步相关类std::mutex.std ...

  8. Java进阶——— 线程池的原理分析

    前言 在了解线程池之前,其实首先出现的疑问是:为什么要使用线程池,其次是了解什么是线程池,最后是如何使用线程池,带着疑问去学习. 为什么要使用 前面多线程文章中,需要使用线程就开启一个新线程,简单方便 ...

  9. spring动态线程池(实质还是用了java的线程池)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

随机推荐

  1. JDBCTemplate

    1.Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装.语法风格非常接近DBUtils. JdbcTemplate可以直接操作数据库,加快效率,而且学这个JdbcTem ...

  2. python编码错误的解决办法 SyntaxError: Non-ASCII character '\xe5' in file

    [提出问题]. 在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* ...

  3. java面向对象(三)之抽象类,接口,向上转型

    java类 java类分为普通类和抽象类,接口,上一节我大概讲了java类的一般格式,今天将抽象类和接口.同时讲一下它们是怎样存储的. 最重要的是理解为什么要有抽象和接口,这样学下来你猜不会迷茫,才能 ...

  4. vue2+swiper(用户操作swiper后,不能autoplay了)

    将autoplayDisableOnInteraction设置为false

  5. chrome开发工具指南(十四)

    模拟和测试其他浏览器 您的任务不只局限于确保网站在 Chrome 和 Android 上出色运行.即使 Device Mode 可以模拟 iPhone 等多种其他设备,我们仍鼓励您查看其他浏览器模拟解 ...

  6. SynchronizedMap和ConcurrentHashMap 区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt215 SynchronizedMap和ConcurrentHashMap的深 ...

  7. JS的this总结(上)-call()和apply()

    JS的this总结(上)-call()和apply() ​ 相信很多人在学习JavaScript的过程中,都会了解到this,而大部分人都会特意去网络上搜一下相关资料,大部分的文章都有这么一句话: t ...

  8. NHibernte教程(10)--关联查询

    本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...

  9. jquery 函数大全

    jquery函数大全转载  Attribute:$(”p”).addClass(css中定义的样式类型); 给某个元素添加样式$(”img”).attr({src:”test.jpg”,alt:”te ...

  10. 防止fixed元素遮挡其他元素的方法

    有多个页面,有的有固定的头部(设置了postion:fixed的元素),有的没有固定的头部,这时就有个问题,有固定头部的页面,头部会遮挡下面的内容,那怎么解决呢? <!DOCTYPE html& ...