背景:查询月统计数据,因为查询日统计数据功能已经实现。月统计数据,只是参一个List(date) 参数,for循环调用日统计,然后把结果整合就OK。

问题:单线程跑  太耗时间

解决方案:使用多线程,利用 ExcutorService 创建一个线程池,使用 CountDownLatch,来做 锁机制。

CountDownLatch的锁机制,可以访问:https://www.cnblogs.com/liun1994/p/7396026.html

下面是实例代码:

  1. /**
  2. * 月 统计数据
  3. *
  4. * @return
  5. * @Param
  6. */
  7. @Override
  8. public ResultData<List<StatResultPo>> queryStatDataList(List<String> dateList) {
  9. ResultData<List<StatResultPo>> resultData = ResultData.built();
  10. List<StatResultPo> list = new ArrayList<>();
  11. /*StatResultPo statResultPo;
  12. for (String date : dateList) {
  13. statResultPo = processedStatData(date);
  14. list.add(statResultPo);
  15. }*/
  16. //设置 线程锁
  17. CountDownLatch cdl = new CountDownLatch(dateList.size());
  18. //线程池
  19. ExecutorService es1 = Executors.newFixedThreadPool(10);
  20.  
  21. for (String date : dateList) {
  22. es1.execute(new Runnable() {
  23. @Override
  24. public void run() {
  25. list.add(processedStatData(date));
  26. //每调用一次countDown()方法,在构造函数中初始化的count值就减1,当N个线程都调用了这个方法count的值等于0,
  27. //然后主线程就能通过await方法,恢复自己的任务。
  28. cdl.countDown();
  29. }
  30. });
  31. }
  32. try {
  33. //恢复主线程
  34. cdl.await();
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. /*Collections.sort(list, new Comparator<StatResultPo>(){
  39. @Override
  40. public int compare(StatResultPo o1, StatResultPo o2) {
  41. //升序
  42. return o1.getDate().compareTo(o2.getDate());
  43. }
  44. });*/
  45. Collections.sort(list, StatResultPo::compareTo);
  46. // 最终返回
  47. resultData.success(list);
  48. return resultData;
  49. }
  1.  
  1.  

线程池(ExecutorService)初体验的更多相关文章

  1. PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束

    PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束 ExecutorService并没有提供什么 isDone()或者isComplete()之类的方法. 作者Atti ...

  2. [Java线程] Java线程池ExecutorService

    示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...

  3. 【Java线程】Java线程池ExecutorService

    示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...

  4. Java线程池ExecutorService和CountDownLatch的小例子

    import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...

  5. 多线程 线程池 ExecutorService

    package org.zln.thread; import java.util.Date; import java.util.concurrent.ExecutorService; import j ...

  6. Java中的线程池ExecutorService

    示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...

  7. (转)线程池 ExecutorService 详细介绍以及注意点区别

    线程池 ExecutorService 相信java开发都用到,这里做个简单笔记 一 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池 ...

  8. 线程池ExecutorService的使用及其正确关闭方法

    创建一个容量为5的线程池 ExecutorService executorService = Executors.newFixedThreadPool(5); 向线程池提交15个任务,其实就是通过线程 ...

  9. 线程池ExecutorService

    说到java开发,免不了跟多线程打交道.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动.执行和关闭, ...

随机推荐

  1. vitualbox安装centos7卡死

    在用vitualbox安装centos7的时候,每次到配置页面,都会莫名卡死,试了几遍才发现不是卡死,而是弹窗用鼠标点击是没用的,需要用tab键和回车来选中执行.

  2. luogu P1736 创意吃鱼法

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

  3. One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:

    C:\Users\arn>webpack -v One CLI for webpack must be installed. These are recommended choices, del ...

  4. 为什么重写equals方法,还必须要重写hashcode方法

    一.equals方法和hashcode的关系 根据Object.hashCode的通用约定: 如果两个对象相同(equals方法返回true),那么hashcode也相等.(图1) 如果两个对象的ha ...

  5. vs2008 asp.net “无法连接到ASP.NET Development server”

    这是因为该网站启动ASP.NET Development server时使用的端口被占用而导致的. 解决方法: 1.在“解决方案资源管理器”中选中网站项目名称,然后切换到“属性”窗口 2.在“属性”窗 ...

  6. C# 引入Sqlite 未能加载文件或程序集“System.Data.SQLite

    个人博客 地址:https://www.wenhaofan.com/article/20190501224046 问题 在Visual Studio 中 使用NuGet 通过 install-pack ...

  7. [CF1304F] Animal Observation - dp,单调队列

    设 \(f[i][j]\) 为第 \(i\) 天在第 \(j\) 个位置放置的最大值,设 \(s[i][j]\) 是第 \(i\) 行的前缀和,则 \[ \begin{align} f[i][j] & ...

  8. 我的python笔记06

    面向对象学习 本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做< ...

  9. ECMAScript基本语法——③数据类型

    Java内有两种 基本数据类型:4类八种 引用数据类型:对象 JavaScript也有两种 原始数据类型 其实是基本数据类型 number:数字.整数.小数.NaN(特殊的数字,not a numbe ...

  10. 16day 逻辑符号系列

    && 与逻辑符号 前一个命令执行成功, 再执行后面的命令 || 或逻辑符号 前一个命令执行失败, 再执行后面的命令 &&符号实践操作: [root@oldboyedu ...