java多线程处理任务【原】

Java多线程处理任务

很多时候,我们需要对一个庞大的队列或者二维数组进行处理。这些处理可能是循环的,比如网络爬出,也可能是有结尾的,比如给一个excel多个sheet的联系人列表发邮件。很幼稚的方法就是用一个或者两个FOR循环搞定,对于庞大的数据有得让你等的。最要命的是当你出去喝茶的时候,程序没有处理好抛出Exception了,那你原本的计划任务都会终止。

多线程的好处是比较多的,特别是能装装B,让你从男孩变成男人的感觉。不废话了,我简化了工作中使用的一个多线程框架,做了些扩展,直接上代码:

1:多线程处理线性队列

public static void processLineTask(final List<Object> list, int threadCount){ //确保线程数量不大于队列长度 threadCount = Math.min(threadCount, list.size()); for(int i = 0;i < threadCount;i++){ new Thread(){ public void run(){ while(true){ Object o; //提取队列元素的时候,需要锁住队列 synchronized(list){ //当队列长度为0的时候,线程逐个结束 if(list.size() == 0){ break; } o = list.remove(0); } //这里可以写一些对元素o的操作 //…… } } }.start(); } }

2:多线程处理环状队列

public static void processCircleTask(final List<Object> list, int threadCount){ //确保线程数量不大于队列长度 threadCount = Math.min(threadCount, list.size()); for(int i = 0;i < threadCount;i++){ new Thread(){ public void run(){ while(true){ Object o; //提取队列元素的时候,需要锁住队列 synchronized(list){ o = list.remove(0); } //这里可以写一些对元素o的操作 //…… //为防止小环导致循环过快,可以给每个o添加时间属性,如果间隔过小就在此sleep //把元素放到队列尾部 synchronized(list){ list.add(o); } } } }.start(); } }

3:多线程处理二维数组,单线处理

public static void processMultiListTask1(final List<List<Object>> list, int threadCount){ //确保线程数量不大于队列长度 threadCount = Math.min(threadCount, list.size()); for(int i = 0;i < threadCount;i++){ new Thread(){ public void run(){ while(true){ List<Object> listSub; //提取值,需要锁住对象 synchronized(list){ if(list.size() == 0){ break; } listSub = list.remove(0); } Object o; for(int i = 0;i < listSub.size();i++){ o = listSub.get(i); //这里可以写一些对元素o的操作 //…… } } } }.start(); } }

4:多线程处理二维数组,交叉处理

public static void processMultiListTask2(final List<List<Object>> list, int threadCount){ //确保线程数量不大于队列长度 threadCount = Math.min(threadCount, list.size()); for(int i = 0;i < threadCount;i++){ new Thread(){ public void run(){ while(true){ Object o; //提取值,需要锁住对象 synchronized(list){ if(list.size() == 0){ break; } if(list.get(0).size() == 0){ list.remove(0); } o = list.get(0).remove(0); } //这里可以写一些对元素o的操作 //…… } } }.start(); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值