Java多线程的使用
来源: 阅读:802 次 日期:2015-04-10 14:15:51
温馨提示: 小编为您整理了“Java多线程的使用”,方便广大网友查阅!

最近在项目里面使用了多线程处理技术,感觉对数据很多批量处理效果蛮好,所以在这里记录下来,给自己一个日子,也分享给大家!

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();

4.1.2 第二部分(这个可以直接作为内部类来处理,不必外建一个类)

class CounterTask implements Callable<JSONArray>{

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,endIndex);

}

}

4.1.3 第三部分代码

protected JSONArray MailCall(int startIndex,int endIndex) {

JSONArray resultArray=new JSONArray();

JSONObject result=null;

for(int i=startIndex;i<endIndex;i++)

{

Object object=dataList.get(i)

//根据你的逻辑做自己的事啦

。。。。。

}

return resultArray;

5.虽然结束了,但还需做一些说明

5.1 在 MailCall这个方法里,由于是多线程,所以这个里面不能使用非线程安全共享的,比如

simpleDateFormat,关于这个怎么去解决,

(1)很多人都是用 apache的commons-lang包的DateUtils和DateFormatUtils类,这两个类的方法是线程安全的。

(2)直接在这个方法里面 new 一个simpleDateFormat的新对象(感觉不好,如果多了不很消耗性能,1000条数据不要new 1000个simpleDateFormat对象么。。。。。。。)

(3)还有其它的就不说了,可自寻搜索啦

更多信息请查看IT技术专栏

更多信息请查看网络编程
手机网站地址:Java多线程的使用
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map