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 }