线程池(ExecutorService)初体验
背景:查询月统计数据,因为查询日统计数据功能已经实现。月统计数据,只是参一个List(date) 参数,for循环调用日统计,然后把结果整合就OK。
问题:单线程跑 太耗时间
解决方案:使用多线程,利用 ExcutorService 创建一个线程池,使用 CountDownLatch,来做 锁机制。
CountDownLatch的锁机制,可以访问:https://www.cnblogs.com/liun1994/p/7396026.html
下面是实例代码:
/**
* 月 统计数据
*
* @return
* @Param
*/
@Override
public ResultData<List<StatResultPo>> queryStatDataList(List<String> dateList) {
ResultData<List<StatResultPo>> resultData = ResultData.built();
List<StatResultPo> list = new ArrayList<>();
/*StatResultPo statResultPo;
for (String date : dateList) {
statResultPo = processedStatData(date);
list.add(statResultPo);
}*/
//设置 线程锁
CountDownLatch cdl = new CountDownLatch(dateList.size());
//线程池
ExecutorService es1 = Executors.newFixedThreadPool(10); for (String date : dateList) {
es1.execute(new Runnable() {
@Override
public void run() {
list.add(processedStatData(date));
//每调用一次countDown()方法,在构造函数中初始化的count值就减1,当N个线程都调用了这个方法count的值等于0,
//然后主线程就能通过await方法,恢复自己的任务。
cdl.countDown();
}
});
}
try {
//恢复主线程
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
/*Collections.sort(list, new Comparator<StatResultPo>(){
@Override
public int compare(StatResultPo o1, StatResultPo o2) {
//升序
return o1.getDate().compareTo(o2.getDate());
}
});*/
Collections.sort(list, StatResultPo::compareTo);
// 最终返回
resultData.success(list);
return resultData;
}
线程池(ExecutorService)初体验的更多相关文章
- PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束
PAIP.并发编程 多核编程 线程池 ExecutorService的判断线程结束 ExecutorService并没有提供什么 isDone()或者isComplete()之类的方法. 作者Atti ...
- [Java线程] Java线程池ExecutorService
示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...
- 【Java线程】Java线程池ExecutorService
示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...
- Java线程池ExecutorService和CountDownLatch的小例子
import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...
- 多线程 线程池 ExecutorService
package org.zln.thread; import java.util.Date; import java.util.concurrent.ExecutorService; import j ...
- Java中的线程池ExecutorService
示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...
- (转)线程池 ExecutorService 详细介绍以及注意点区别
线程池 ExecutorService 相信java开发都用到,这里做个简单笔记 一 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池 ...
- 线程池ExecutorService的使用及其正确关闭方法
创建一个容量为5的线程池 ExecutorService executorService = Executors.newFixedThreadPool(5); 向线程池提交15个任务,其实就是通过线程 ...
- 线程池ExecutorService
说到java开发,免不了跟多线程打交道.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动.执行和关闭, ...
随机推荐
- Git的精简用法
作为一名开发人员,提交代码那是家常便饭,那如何有效地利用Git进行提交代码呢?在这里介绍一些常用.必要的命令,几乎够工作中使用了. (1)git pull 命令:拉取代码,这条命令没啥说的了,在提交代 ...
- TCP 与 UDP 浅谈
TCP与UDP区别总结:1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2.TCP提供可靠的服务.也就是说,通过TCP连接传送的数据,无差错,不丢失,不重 ...
- appium 爬取微信的相册内容(不知什么时候能写完)
# crowl wechat through appium from appium import webdriver from selenium.webdriver.support.ui import ...
- 推荐15款Google Chrome 插件
Google Chrome是由Google开发的免费网页浏览器.Chrome是化学元素“铬”的英文名称,过去也用Chrome称呼浏览器的外框.Chrome相应的开放源代码计划名为Chromium,而G ...
- mysql常用函数及关键字汇总
关键字 1...mysql包含之in SELECT count(1) as count FROM 表名 a,表名 b WHERE a.主键 = b.外键 and a.字段 in('1','2,'3' ...
- Linux下安装python,mysql,redis
linux 安装Python3 1.python下载 请在终端输入如下命令: cd /home wget http://cdn.npm.taobao.org/dist/python/3.6.5/Pyt ...
- 事件分析法学习笔记(ESM)
事件分析法基础学习笔记 1.定义 事件分析法是研究某事件的发生对组织价值的影响以及影响程度. 或者说研究特定事件对组织行为的影响. notes:事件分析法的关键点在于探讨所关注事件在某个时段产生的 ...
- Visual Studio 问题汇总
VS2019 16.3.6 1 JSON 文件没有进行格式化验证 开发时运行正常,部署在IIS中有错误提示. 2 .NET Core 3.0 没有提供中文包 所有注释都是英文的.
- maven-设置aliyun远程库
maven默认的远程库下载起来非常慢,习惯改成aliyun的库. 一.修改maven配置 打开maven配置文件setting.xml,改mirror <mirrors> <mirr ...
- Android_Activity的生命周期、跳转方式及参数传递、启动模式。
Activity的生命周期: onCreat ,onStart,onResume,onPause,onRestart,onStop,onDestroy Activity之间的跳转分为显式跳转和隐式跳转 ...