java利用线程池处理集合
java利用线程池处理集合
java用线程池处理集合问题
循环集合每多少条数据开启一个集合,此处每十万数据开启一个线程
public void testStr() {
List<BaseEntity> list = new ArrayList<>();
for (int i = 0; i < 2000000; i++) {
BaseEntity entity = new BaseEntity();
entity.setId("这是**一个**测试" + i);
list.add(entity);
}
long start = System.currentTimeMillis();
check = new ChineseCheck();
ExecutorService executor = Executors.newFixedThreadPool(5);
int size = list.size();
if (size > 100000) {
int batch = size % 100000 == 0 ? size / 100000 : size / 100000 + 1;
for (int j=0; j<batch; j++) {
int end = (j+1)*100000;
if (end > size) {
end = size;
}
List<BaseEntity> subList = list.subList(j*100000, end);
TestCallable callable = new TestCallable(subList, check);
executor.execute(callable);
}
}
executor.shutdown();
while (true) {
if (executor.isTerminated()) {
break;
}
}
long date = System.currentTimeMillis() - start;
System.out.println("======" + date + "======");
}
用时:1361 ms
两百万条数据做校验,每一条数据开一个线程
List<BaseEntity> list = new ArrayList<>();
for (int i = 0; i < 2000000; i++) {
BaseEntity entity = new BaseEntity();
entity.setId("这是**一个**测试" + i);
list.add(entity);
}
long start = System.currentTimeMillis();
check = new ChineseCheck();
ExecutorService executor = Executors.newFixedThreadPool(5);
for (BaseEntity entity: list) {
TestCallable callable = new TestCallable(entity, check);
executor.execute(callable);
}
executor.shutdown();
while (true) {
if (executor.isTerminated()) {
break;
}
}
long date = System.currentTimeMillis() - start;
System.out.println("======" + date + "======");
用时:29875 ms
以上两种情况对比,当使用线程池开启多线程的时候,每一个线程中校验多条数据,此时效率会高
可以按照这批数据的处理次数来创建线程池,规定线程池最大线程数,然后不大于这个线程数的时候可以按照处理次数来创建线程
此处,多个线程同用一个单例处理数据和多线程用不同的实例对象处理数据效果相同
即,此处循环list时,是否每次都new一个check
java利用线程池处理集合的更多相关文章
- java中线程池的几种实现方式
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建 ...
- Java进阶——— 线程池的原理分析
前言 在了解线程池之前,其实首先出现的疑问是:为什么要使用线程池,其次是了解什么是线程池,最后是如何使用线程池,带着疑问去学习. 为什么要使用 前面多线程文章中,需要使用线程就开启一个新线程,简单方便 ...
- 深入理解Java之线程池
原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- java中线程池的使用方法
1 引入线程池的原因 由于线程的生命周期中包括创建.就绪.运行.阻塞.销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建.销毁线程需要很大的 ...
- Java使用线程池递归压缩文件夹下面的所有子文件
本文将介绍Java中利用线程池递归的方式压缩文件夹下面的所有子文件,具体方法如下: Gzip单个文件压缩 对于单个文件使用GZip压缩. package date0805.demo1; import ...
- Java中线程池的学习
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...
- 【java】-- 线程池原理分析
1.为什么要学习使用多线程? 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担. 线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致 ...
- 深入理解Java之线程池(爱奇艺面试)
爱奇艺的面试官问 (1) 线程池是如何关闭的 (2) 如何确定线程池的数量 一.线程池销毁,停止线程池 ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown() ...
- [转]深入理解Java之线程池
原文链接 原文出处: 海 子 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这 ...
随机推荐
- WorldCount代码检查与优化——软件测试第三次作业
合作者:201631062222,201631062232 代码地址:https://gitee.com/biubiubiuLYQ/ceshi_secend 本次作业链接地址:https://edu. ...
- 在Mac 系统上使用MAMP搭建PHP开发环境
1.下载MAMP套件 下载地址为https://www.mamp.info/en/ 2.安装此.dmg文件 3.配置apache虚拟主机 (1)在/Applications/MAMP/conf/apa ...
- Serialize a Long as a String
今天在写接口的时候,用postman测试,返回数据与数据库一一对应,但是给前端返回的结果,除了主键id以外,其他都一样,如下 postman: { "unitPrice": nul ...
- 今日头条移动app广告激活数据API对接完整Java代码实现供大家参考》》》项目随记
这是自毕业后的第一篇博客,希望自己今后能养成写博客的一个好习惯.最近公司为了加速APP推广,采取在外部平台(如:今日头条)进行广告投放的方式,进行用户引流.因此我们需要对广告的激活数据进行一个检测,跟 ...
- 关于读取mapper的两种方式
第一种: 第二种:
- JVM安全点操作与测试小记
JVM的安全点学习与代码测试 监控安全点(打印JVM停顿时间,不止GC,处理毛刺): -XX:+PrintGC -XX:+PrintGCApplicationStoppedTime 取消偏向锁: -X ...
- HTML知识点总结[部分]
Web服务的本质(socket实例) import socket def handle_request(client): buf = client.recv(1024) client.send(byt ...
- P1130 红牌
题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派 ...
- Codeforces1023E Down or Right 【贪心】
题目分析: 从起点开始询问终点连通性,优先右走.从终点开始询问起点连通性,优先上走. 代码: #include<bits/stdc++.h> using namespace std; in ...
- 如何判断是否为同一个App,Ionic3如何修改包名
如何判断是否同一个App 使用Ionic3创建了两个项目demo1.demo2,然后使用同一个JDK,生成了两个不同的keystore证书. 结果在手机端安装的时候,先安装demo1,没有任何替换的提 ...