这几天接触到了一些操作list的功能,由于list太长,加上每条数据的处理时间,导致性能下降,正好利用学来的多线程知识和网上的资料结合实践一番,写出了一个通用类如下。

/**
* 操作数组的线程
*
* @author 80004133
*/
public abstract class OperateListThread{
/**
* 核心数组,用户需要操作的数组
*/
public Object[] arr; private static final Logger logger = LoggerFactory.getLogger(OperateListThread.class);
/**
* 操作数组线程的数量,默认为5
*/
private int threadNum = 5; ExecutorService exec; public OperateListThread(List obj, int threadNum){
this.arr = obj.toArray();
this.threadNum = threadNum;
exec = Executors.newFixedThreadPool(threadNum+1);
} /**
* 获取操作数组后的结果
* <p>
* 有返回结果时重写该方法
* </p>
* @return
*/
public Object getResult(){
return null;
}; /**
* 用户需要实现的方法
* <p>
* 代表用户希望做什么事情,该方法被run方法调用,需要用户实现
* </p>
*/
public abstract void doRun(int index); /**
* 调用此方法开始工作
* @throws InterruptedException
*/
public void doWork() throws InterruptedException {
logger.info("Work start ------");
long start = System.currentTimeMillis();
int length = arr.length;
CountDownLatch latch = new CountDownLatch(arr.length % threadNum == 0 ? threadNum : threadNum+1);
logger.info("length:" + length + ":" + "latch:" + latch.getCount());
for (int j = 0; j < length; j += length / threadNum) {
MyThread m = null;
if ((j + (length / threadNum)) <= length) {
m = new MyThread(arr, j, j + length / threadNum, latch);
} else {
m = new MyThread(arr, j, length, latch);
}
exec.execute(m);
}
latch.await();
exec.shutdown();
logger.info("Spand time:" + (System.currentTimeMillis() - start));
logger.info("Work end -------");
} public class MyThread implements Runnable {
Object[] arr;
int startIndex;
int endIndex;
CountDownLatch latch; public MyThread(Object[] arr, int startIndex, int endIndex, CountDownLatch latch) {
this.arr = arr;
this.startIndex = startIndex;
this.endIndex = endIndex;
this.latch = latch;
} @Override
public void run() {
for (int i = startIndex; i < endIndex; i++) {
//要做的事
doRun(i);
}
logger.info(Thread.currentThread().getName());
latch.countDown();
}
} public static void main(String[] args) throws InterruptedException{
List<Integer> arr = new ArrayList<>();
for (int i = 1; i <= 10000; i++) {
arr.add(i);
}
// int sum = 0;
// for (int a: arr) {
// sum += a;
// }
// System.out.println(sum);
OperateListThread op = new OperateListThread(arr, 5) {
public int sum = 0; public Object getResult() {
return sum;
} @Override
public void doRun(int index) {
sum += (int) arr[index];
}
};
op.doWork();
int result = (int)op.getResult();
System.out.println(result);
}
}

main方法举了一个很简单的使用实例,计算1+2+3+...+10000的和。这个通用类是一个抽象类,用法是实现这个抽象类,并只需要实现简单的doRun()方法,这个方法主要是对list做什么样的操作,index代表当前数组的位置,核心数组为arr。若你需要得到返回值,可以重写getResult()方法来获取返回值。

当然,有更好的方案或可以改正的地方欢迎联系我(QQ:2470244153),或在评论处留下您的留言。

一种优化操作list、数组的多线程解决方案。的更多相关文章

  1. [转]通俗易懂的php多线程解决方案

    原文: https://www.w3cschool.cn/php/php-thread.html --------------------------------------------------- ...

  2. 绝对好文C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文  http://blog.csdn.net/xxdddail/art ...

  3. JS中几种常见的数组算法(前端面试必看)

    JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...

  4. 一种使用pyinstaller时图标问题解决方案

    一种使用pyinstaller时图标问题解决方案 0x00 场景   使用pyinstaller将.py文件编译成.exe文件时,想要使用自己心仪的图标(.ico)比较麻烦.在使用pyinstalle ...

  5. Numpy的ndarry:一种多维数组对象

    Numpy的ndarry:一种多维数组对象 Numpy最重要的一个特点就是其N维数组对象(即ndarry),该对象是一个快速而灵活的大数据集容器.你可以利用这种数组对整块数据执行一些数学运算,其语法跟 ...

  6. Java并发和多线程2:3种方式实现数组求和

    本篇演示3个数组求和的例子. 例子1:单线程例子2:多线程,同步求和(如果没有计算完成,会阻塞)例子3:多线程,异步求和(先累加已经完成的计算结果) 例子1-代码 package cn.fansuni ...

  7. lua多线程解决方案

    直观的讲:lua并不支持多线程,lua语言本身具有携程功能,但携程仅仅是一种中继器. lua多线程的目的:有并发需求时,共享一些数据. 例如使用lua写一个并发服务器.用户登陆之后,用户数据储存在lu ...

  8. 几种php 删除数组元素方法

    几种php教程 删除数组元素方法在很多情况下我们的数组会出现重复情况,那我们删除数组中一些重复的内容怎么办,这些元素我必须保持他唯一,所以就想办法来删除它们,下面利用了遍历查询来删除重复数组元素的几种 ...

  9. 堆的 两种实现 (数组和STL)

    基本思想: 两种操作都跟树的深度成正比,所以复杂度  O(log(n)) ; push():在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提直到没有大小颠倒为止. pop(): 从堆中取出 ...

随机推荐

  1. 打开前端工程 Node Sass does not yet support your current environment: Windows 64-bit

    卸载当前sass版本,重新安装sass 打开cmd进入工程文件夹: 删除 npm uninstall --save node-sass 安装 npm install --save node-sass ...

  2. 3-1 Pandas-概述

    Pandas章节应用的数据可以在以下链接下载: https://files.cnblogs.com/files/AI-robort/Titanic_Data-master.zip Pandas:数据分 ...

  3. 04.UTXO:未使用的交易输出,比特币核心概念之一

    在比特币系统上其实并不存在“账户”,而只有“地址”.只要你愿意,你就可以在比特币区块链上开设无限多个钱包地址,你拥有的比特币数量是你所有的钱包地址中比特币的总和.比特币系统并不会帮你把这些地址汇总起来 ...

  4. K8s的api gateway---ambassador实操

    对于api gateway,以前总是认知感觉和proxy差不多. 最近几天,撸完了ambassador的官方文档,才比较系统的了解了gateway的功能. 它和传统的nginx proxy或是k8s里 ...

  5. 201871010131-张兴盼《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  6. 201871020225-牟星源《面向对象程序设计(java)》第十一周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十一周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu ...

  7. VC 静态库与动态库(四)动态库创建与使用_显示调用

    在第三章的基础上,接着添加一个显示调用项目 显示调用项目创建: 1.给解决方案添加一个新的控制台项目DisplayCall用于测试动态库,创建完成后设置为启动项目 2.DisplayCall.cpp添 ...

  8. 测试脚本中的等待方法 alter对话框处理

    测试脚本中的等待方法 等待是为了使脚本执行更加稳定 1. 常用的休眠方式:time模块的sleep方法 2. selenium模块中的等待方法 等待查找5s 查找不到就报错 对登录测试py进行修改 a ...

  9. 4,VS常见问题解决(一闪而过、等问题)不断更新

    当然入门学c可以用VS,但是深入就不应该用VS(MSVC)编译器了,毕竟VS2017还没有完全支持C99(这个从VS2017没有实现变长数组可见) 但是想看c源码,还是 1. 推荐用 *nix系统 2 ...

  10. leetcode 674. 最长连续递增序列

    1. 题目 给定一个未经排序的整数数组,找到最长且连续的的递增序列. 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3. 尽管 [1,3, ...