关闭

Java多线程的使用

发表于:2015-3-19 10:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:qyb0906    来源:51Testing软件测试网采编

  最近在项目里面使用了多线程处理技术,感觉对数据很多批量处理效果蛮好,所以在这里记录下来,给自己一个日子,也分享给大家!
  1.首先根据条件得到你的数据集合dataList(此处用dataList表示)
  1.1个人觉得如果得到的数据很少的话,就没必要使用多线程了
  2.用 int threadNum = Runtime.getRuntime().availableProcessors();得到你的cpu内核数
  2.1对于内核数这个来做下自己的说明,当时自己在做的时候,查看了一些对于使用cpu核数的文章
  有些高手做了一些性能方面的测试,表示当核数叫多的时候,处理性能提升很好,但更多的时候,已经没有那么明显的效果了(好像记得那位高手借鉴了IBM的某个文章来说了的),这个大家可以另外去搜索查询下,个人是以 4个为标准来做的,大家可以自寻决定
  3. 根据dataListSize 与 threadNum,来计算每个线程需要处理的数据量
  3.1 相关代码
int threadListSize = dataListSize;
if(listSize<threadNum)
{
threadNum=1;
}
else if(threadNum>4)
{
threadNum=4;
threadListSize = listSize / threadNum;
}
else
{
threadListSize = listSize / threadNum;
}
final int[] dataRange = new int[threadNum];
for (int i = 0; i < threadNum - 1; i++) {
dataRange[i] = threadListSize * (i + 1);
}
//有些不可能一下子除断,所以最后一个dataRange必须包含剩下所有的
dataRange[threadNum - 1] = listSize;
  3.2一些说明
  大家可能问我这是要干什么,我来慢慢说明。由于数据集合 dataList 只有一个,但你需要做多线程处理,那怎么办?根据cpu内核数(threadNum)把这个数据集合 dataList分成几个 数据集合?
  不行了,性能太差了,直接根据list的索引来做啦,比如list.get(0),直接把索引分成对应的几个部分,然后dataList直接调用
  4.开始多线程啦
  4.1 相关代码
  4.1.1第一部分
ExecutorService executor = Executors.newFixedThreadPool(threadNum);
Future<JSONArray>[] results = new Future[threadNum];
for (int i = 0; i < threadNum; i++) {
int startIndex=0;
if(i!=0)
{
startIndex=dataRange[i-1];
}
results[i]=executor.submit(new CounterTask(startIndex, dataRange[i]));
}
//每个线程处理完了之后,就会把对应返回的结果返回到 Future<JSONArray>[]
JSONArray resultArray=new JSONArray();
for(int i = 0; i < threadNum; i++)
{
resultArray.addAll(results[i].get());
}
//这个不要忘了
executor.shutdown();
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号