很多时候,我们需要对一个庞大的队列或者二维数组进行处理。这些处理可能是循环的,比如给一个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();
- }
- }