多线程处理list

 
   
  1 package test;

  2 

  3 import java.util.LinkedList;

  4 import java.util.List;

  5 import java.util.concurrent.CountDownLatch;

  6 

  7 public class ThreadTest {

  8 

  9     /**

 10      * 多线程处理list

 11      * 

 12      * @param data

 13      *            数据LinkedList,线程安全

 14      * @param threadNum

 15      *            线程数

 16      * @throws InterruptedException

 17      */

 18     public synchronized void handleList(LinkedList<String> data, int threadNum) throws InterruptedException {

 19         int length = data.size();

 20         int tl = length % threadNum == 0 ? length / threadNum : (length / threadNum + 1);

 21         CountDownLatch latch = new CountDownLatch(100);// 多少协作

 22         long a = System.currentTimeMillis();

 23         for (int i = 0; i < threadNum; i++) {

 24             int end = (i + 1) * tl;

 25             if ((i * tl) <= length) {

 26                 // 继承thread启动线程

 27                 // HandleThread thread = new HandleThread("线程[" + (i + 1) +"] ",data, i * tl, end > length ? length : end, latch);

 28                 // thread.start();

 29 

 30                 // 实现Runnable启动线程

 31                 RunnableThread thread = new RunnableThread("线程[" + (i + 1) + "] ", data, i * tl, end > length ? length : end, latch);

 32                 Thread runable = new Thread(thread);

 33                 runable.start();

 34             }

 35         }

 36         latch.await();// 等待所有工人完成工作

 37         System.out.println("结束*****************************");

 38         long b = System.currentTimeMillis();

 39         System.out.println("时间:" + (b - a) + "毫秒***********************");

 40     }

 41 

 42     // 继承Thread

 43     class HandleThread extends Thread {

 44         private String threadName;

 45         private List<String> data;

 46         private int start;

 47         private int end;

 48         private CountDownLatch latch;

 49 

 50         public HandleThread(String threadName, List<String> data, int start, int end, CountDownLatch latch) {

 51             this.threadName = threadName;

 52             this.data = data;

 53             this.start = start;

 54             this.end = end;

 55             this.latch = latch;

 56         }

 57 

 58         public void run() {

 59             // TODO 这里处理数据

 60             List<String> l = data.subList(start, end);

 61             System.out.println(threadName + "--" + data.size() + "--" + start + "--" + end + "--");

 62             for (int i = 0; i < l.size(); i++) {

 63                 // 单个线程中的数据

 64                 System.out.println(l.get(i));

 65             }

 66             latch.countDown();// 工人完成工作,计数器减一

 67         }

 68     }

 69 

 70     // 实现Runnable

 71     class RunnableThread implements Runnable {

 72         private String threadName;

 73         private List<String> data;

 74         private int start;

 75         private int end;

 76         private CountDownLatch latch;

 77 

 78         public RunnableThread(String threadName, List<String> data, int start, int end, CountDownLatch latch) {

 79             this.threadName = threadName;

 80             this.data = data;

 81             this.start = start;

 82             this.end = end;

 83             this.latch = latch;

 84         }

 85 

 86         public void run() {

 87             // TODO 这里处理数据

 88             List<String> l = data.subList(start, end);

 89             System.out.println(threadName + "--" + data.size() + "--" + start + "--" + end + "--");

 90             for (int i = 0; i < l.size(); i++) {

 91                 // 单个线程中的数据

 92                 System.out.println(l.get(i));

 93             }

 94             latch.countDown();// 工人完成工作,计数器减一

 95         }

 96     }

 97 

 98     public static void main(String[] args) throws InterruptedException {

 99         ThreadTest test = new ThreadTest();

100 

101         // 准备数据

102         LinkedList<String> data = new LinkedList<String>();

103         for (int i = 0; i < 100; i++) {

104             data.add("item" + "  " + i);

105         }

106         test.handleList(data, 100);

107         // System.out.println(ArrayUtils.toString(data));

108 

109     }

110 }

  

你可能感兴趣的:(list)