java利用线程池处理集合

2018年07月23日 17:21:19 衍夏成歌 阅读数:866
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_38364990/article/details/81170003

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利用线程池处理集合的更多相关文章

  1. java中线程池的几种实现方式

    1.线程池简介:    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创建 ...

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

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

  3. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  4. java中线程池的使用方法

    1 引入线程池的原因 由于线程的生命周期中包括创建.就绪.运行.阻塞.销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建.销毁线程需要很大的 ...

  5. Java使用线程池递归压缩文件夹下面的所有子文件

    本文将介绍Java中利用线程池递归的方式压缩文件夹下面的所有子文件,具体方法如下: Gzip单个文件压缩 对于单个文件使用GZip压缩. package date0805.demo1; import ...

  6. Java中线程池的学习

    线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...

  7. 【java】-- 线程池原理分析

    1.为什么要学习使用多线程? 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担. 线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致 ...

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

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

  9. [转]深入理解Java之线程池

    原文链接 原文出处: 海 子 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这 ...

随机推荐

  1. VS Code & MacOS & Zsh

    VS Code & MacOS & Zsh https://code.visualstudio.com/docs/setup/mac solution OK bug $ cat .zs ...

  2. Python——Flask框架——模板

    一.渲染模板 render_template 函数把Jinja2模板引擎集成到程序中 二.Jinja2变量过滤器 过滤器名 说明 safe 渲染值是不转义 capitalize 把值得首字母转换成大写 ...

  3. Thread的其他属性方法

    from threading import Thread,currentThread,active_count import time def task(): print('%s is running ...

  4. codeforces618B

    Guess the Permutation CodeForces - 618B Bob has a permutation of integers from 1 to n. Denote this p ...

  5. CF980E

    题面 Panel 国将举办名为数字游戏的年度表演.每个省派出一名选手. 国家有 n 个编号从 1 到 n 的省,每个省刚好有一条路径将其与其他省相连.第 i 个省出来的代表有 2^i 名粉丝. 今年, ...

  6. Node.js 安装与管理

    一.node安装 Windows下,官网下载 Node.js 安装包,运行安装即可, 安装成功后,可查看版本号 node -v 二.npm npm 是 node 包管理工具,随同node一起安装,安装 ...

  7. [BZOJ 3498] [PA 2009] Cakes

    Description \(n\) 个点 \(m\) 条边,每个点有一个点权 \(a_i\). 对于任意一个三元环 \((i,j,k)(i<j<k)\),它的贡献为 \(\max(a_i, ...

  8. BZOJ3144[Hnoi2013]切糕——最小割

    题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...

  9. 洛谷P3870开关题解

    我们先看题面,一看是一个区间操作,再看一下数据范围,就可以很轻松地想到是用一个数据结构来加快区间查询和修改的速度,所以我们很自然的就想到了线段树. 但是这个题还跟普通的线段树不一样,这个题可以说要思考 ...

  10. 【BZOJ1565】【NOI2009】植物大战僵尸 网络流 最大权闭合子图

    题目大意 ​ 给你一个\(n\times m\)的地图,每个格子上都有一颗植物,有的植物能保护其他植物.僵尸从右往左进攻,每吃掉一颗植物就可以得到\(a_{i,j}\)的收益(\(a_{i,j}\)可 ...