多线程处理list

时间:2021-07-12 18:32:25
 
 
  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 }