使用ExecutorService,解决多任务同时进行,并等待全部任务完成合并数据

  • 一、ExecutorService使用
    • 二、Future使用
    • 三、功能实现
      • AAAThreadHttpRequest
      • Callable方法
    • 结论

一、ExecutorService使用

刚好做项目的时候碰到类似的需求记录一下,具体代码不方便展示用了网上的代码,底下代码是用网上代码修改的,可不可以运行没调试过,只提供大概思路和解决网上代码的问题,网上很多使用底下这种形式创建ExecutorService,但是阿里的编码规范并不推荐这样创建线程池
ExecutorService exc= Executors.newFixedThreadPool(10);
推荐使用一下方式创建ExecutorService

        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();//创建线程池ExecutorService exc = new ThreadPoolExecutor(searchKeyTypes.length, searchKeyTypes.length, 0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), namedThreadFactory);

其中ThreadPoolExecutor的构造方法如下:

publicThreadPoolExecutor(intcorePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnitunit,BlockingQueue<Runnable>workQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler)

具体各个参数对线程池的影响可以参考https://blog.csdn.net/jubaoquan/article/details/79198780

二、Future使用

在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。

      //申明数据回调处理类List<Future<JSONObject>>List<Future<JSONArray>> futures = new ArrayList<>();

三、功能实现

AAAThreadHttpRequest

public class AAAThreadHttpRequest
{ //首页返回所需的参数和接口,电影接口//热门电影private String hotfilmUrl = "http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=1&limit=30&sr=1";//热门电视剧private String hotdianshijuUrl = "http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=2&limit=5&sr=2";//热门动漫private String hotanimationUrl = "http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=4&limit=5&sr=3";//第一个分段数据private String segmentOneUrl ="http://expand.video.iqiyi.com/api/top/list.json?apiKey=?&topType=1&categoryId=7&limit=6&sr=5";//淘宝客 public      LinkedList<JSONObject>  ShiPinThreadHandle() throws JSONException, IOException, InterruptedException, ExecutionException
{//组合线程请求参数String[] urlList = new String[]{hotfilmUrl,hotdianshijuUrl};//创建线程名ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();//创建线程池ExecutorService exc = new ThreadPoolExecutor(urlList .length, urlList .length, 0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), namedThreadFactory);//申明数据回调处理类List<Future<JSONObject>>List<Future<JSONObject>> futures = new ArrayList<Future< JSONObject>>();  for (String url : urlList) {  //申请单个线程执行类ShiPinThreadHandleRequest call =new ShiPinThreadHandleRequest(url);  //提交单个线程Future< JSONObject> future = exc.submit(call);  //将每个线程放入线程集合, 这里如果任何一个线程的执行结果没有回调,线程都会自动堵塞futures.add(future);  }  //所有线程执行完毕之后会执行下面的循环,然后通过循环每个个线程后执行线程的get()方法每个线程执行的结果for (Future< JSONObject> future : futures) {     //这边就能获取返回的数据集 剩下根据自己想要的业务逻辑自行编写JSONObject json= future.get();}  //关闭线程池exc.shutdown();  //这里由于我直接将返回结果放入到单利中缓存了,所有返回nullreturn null;}

Callable方法

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

Callable执行代码类

public   class ShiPinThreadHandleRequest implements Callable<JSONObject> {  private  String url;public ShiPinThreadHandleRequest(String url) throws JSONException, IOException {  //这边其实就是为了传入相关参数,不要在这边直接执行业务你要异步的业务,不然还是同步运行你要的业务this.url=url;}  //数据回调public JSONObject call() throws Exception {  //随便写的,这边就执行你要的业务逻辑,然后返回你要的结果JSONObject result = HttpUtil.doPost(this.url)return result;  }
}

结论

虽然自己用Thread写线程也可以实现上面的效果,但是比较麻烦,用上面的方法可以简化不少代码

使用ExecutorService,解决多任务同时进行,并等待全部任务完成合并数据相关推荐

  1. 多目标机器学习_NIPS2018 - 用多目标优化解决多任务学习

    题外话: 多任务学习可以说是机器学习的终极目标之一, 就像物理学家在追求统一所有力一样, 个人认为机器学习也在追求一个模型解决几乎所有问题. 虽然我们现在还离这个目标很远, 但是多任务学习在实际应用中 ...

  2. 5.8 go 解决多任务资源竞争问题

    /**两人同时打印,竞争资源输出: F:\goWorkSpace\study\05协程>go run 08_解决多任务资源竞争问题.go wheolrlldo 并不是helloword,为了解决 ...

  3. 微信小程序 解决请求服务器手机预览请求不到数据的方法

    微信小程序 解决请求服务器手机预览请求不到数据的方法 微信小程序的文档中明确说明了所有的请求是必须使用https的,以没用过https,由于小程序,不得不接触到https,研究了好长时间把tomcat ...

  4. 【解决方法】Panda read_csv()把第一行的数据变成了列名,怎么处理

    前言 有些时候,我们会遇到很多这样的数据,比如,这个csv的第一行并不是我们想象中的那样是一个列名.那样,我们处理数据的时候,就会出现问题,第一个不一致了嘛. 解决方案1 调用csv库,自己重新编写读 ...

  5. (编程解决)List和Hashtable都是可以存储数据的,可为什么有时选择List,有时需要Hashtable,这两个

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! (编程解 ...

  6. 解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找

    解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找 参考文章: (1)解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找 (2)https://ww ...

  7. Excel合并数据查找函数VLOOKUP()一直显示最后一行数据或者一直报错的解决方法

    Excel合并数据查找函数VLOOKUP()一直显示最后一行数据或者一直报错的解决方法 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地 ...

  8. 解决Win XP登录后等待10分钟才显示桌面的问题

    一位朋友的电脑最近出现了奇怪的问题:登录后等待10分钟才显示桌面,系统托盘区的瑞星杀毒软件.防火墙.卡卡安全助手.QQ电脑管家的监控图标有时不显示,需要手动启动.请偶帮忙解决. 开机,在登录界面选择用 ...

  9. 主线程如何等待多线程完成 返回数据_多线程基础体系知识清单

    作者:Object 来源:https://juejin.im/user/5d53e1f6f265da03af19cae0/posts 前言 本文会介绍Java中多线程与并发的基础,适合初学者食用. 线 ...

最新文章

  1. 光剑免费图书馆 Free Ebooks
  2. SurfaceTexture
  3. js unix时间戳转换
  4. Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...
  5. Flutter业务开发常用小技巧(样式布局篇)
  6. OBS录制黑屏的解决办法
  7. C#使用Socket实现一个socket服务器与多个socket客户端通信
  8. word文本框中插入文本框_如何在Word中打印隐藏的文本
  9. 计算机组成原理:时钟周期、机器周期和指令周期
  10. 在mysql中 使用in关键字实现子查询_MySQL 之子查询
  11. 第一集 斗罗世界 第五章
  12. Eclipse设置项目编码格式的两种方式
  13. C语言编译过程流程图
  14. 类选择器和ID选择器的区别
  15. 超火壁纸!隐藏 Dock 栏+AirTag 渐变
  16. 《庖丁解牛Linux内核》笔记之:调用堆栈
  17. Spring Security OAuth2:整合jwt
  18. 大数据培训靠不靠谱?如何选择培训机构?
  19. 利用Fiddler抓包解析,轻松下载m3u8格式网络视频
  20. 【装修选材】自然系原木,才是空间真正的百搭之王!

热门文章

  1. 计算机每次开机配置更新失败,win10系统开机总是提示配置windows更新失败的解决方案...
  2. 计算机组成原理考研复习
  3. 中河广播服务器怎么连接无线话筒,无线话筒怎么连接音响 无线话筒怎么用
  4. blender拉丝纹理
  5. sublime中开启表格插入
  6. 苹果6访问限制密码4位_Aiseesoft iPhone Unlocker(苹果设备解锁工具) 官方版v1.0.22 下载...
  7. 【Selenium项目实战】项目环境搭建:安装JDK、mysql、Tomcat、jpress和测试系统
  8. ps等程序默认用管理员方式打开
  9. Android的viewHolder模式
  10. 小星星AI陪练APP功能介绍