Java多线程的用法__第1页
Java多线程的用法__第2页
Java多线程的用法__第3页
Java多线程的用法__第4页
Java多线程的用法__第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java多线程的用法_ 最近在项目里面用法了多线程处理技术,感觉对数据许多批量处理效果蛮好,所以在这里记录下来,给自己一个日子,也分享给大家! 1.首先依据条件得到你的数据集合dataList(此处用dataList表示) 1.1个人觉得假如得到的数据很少的话,就没必要用法多线程了 2.用 int threadNum = Runtime.getRuntime().availableProcessors();得到你的cpu内核数 2.1对于内核数这个来做下自己的说明,当时自己在做的时候,查看了一些对于用法cpu核数的文章 有些高手做了一些性能方面的测试,表示当核数叫多的时候,处理性能提升很好,但

2、更多的时候,已经没有那么明显的效果了(似乎记得那位高手借鉴了IBM的某个文章来说了的),这个大家可以另外去搜索查询下,个人是以 4个为标准来做的,大家可以自寻决定 3. 依据dataListSize 与 threadNum,来计算每个线程需要处理的数据量 3.1 相关代码 int threadListSize = dataListSize; if(listSizethreadNum) threadNum=1; else if(threadNum4) threadNum=4; threadListSize = listSize / threadNum; else threadListSize =

3、 listSize / threadNum; final int dataRange = new intthreadNum; for (int i = 0; i threadNum - 1; i+) dataRangei = threadListSize * (i + 1); /有些不行能一下子除断,所以最终一个dataRange必需包含剩下全部的 dataRangethreadNum - 1 = listSize; 3.2一些说明 大家可能问我这是要干什么,我来慢慢说明。由于数据集合 dataList 只有一个,但你需要做多线程处理,那怎么办?依据cpu内核数(threadNum)把这个数据

4、集合 dataList分成几个 数据集合? 不行了,性能太差了,挺直依据list的索引来做啦,比如list.get(0),挺直把索引分成对应的几个部分,然后dataList挺直调用 4.开头多线程啦 4.1 相关代码 4.1.1第一部分 ExecutorService executor = Executors.newFixedThreadPool(threadNum); FutureJSONArray results = new FuturethreadNum; for (int i = 0; i threadNum; i+) int startIndex=0; if(i!=0) startI

5、ndex=dataRangei-1; resultsi=executor.submit(new CounterTask(startIndex, dataRangei); /每个线程处理完了之后,就会把对应返回的结果返回到 FutureJSONArray JSONArray resultArray=new JSONArray(); for(int i = 0; i threadNum; i+) resultArray.addAll(resultsi.get(); /这个不要忘了 executor.shutdown(); 4.1.2 其次部分(这个可以挺直作为内部类来处理,不必外建一个类) cla

6、ss CounterTask implements CallableJSONArray private int startIndex; private int endIndex; public CounterTask(int startIndex,int endIndex) this.startIndex=startIndex; this.endIndex=endIndex; Override public JSONArray call() throws Exception / TODO Auto-generated method stub return MailCall(startIndex

7、,endIndex); 4.1.3 第三部分代码 protected JSONArray MailCall(int startIndex,int endIndex) JSONArray resultArray=new JSONArray(); JSONObject result=null; for(int i=startIndex;iendIndex;i+) Object object=dataList.get(i) /依据你的规律做自己的事啦 。 return resultArray; 5.虽然结束了,但还需做一些说明 5.1 在 MailCall这个方法里,由于是多线程,所以这个里面不能用法非线程平安共享的,比如 simpleDateFormat,关于这个怎么去解决, (1)许多人都是用 apache的commons-lang包的DateUtils和DateFormatUtils类,这两个类的方法是线程平安的。 (2)挺直在这个方法里面 n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论