java线程池分段处理list集合

package com.chenva.main.util;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TheardPoolTest  {

    public static void main(String[] args) throws InterruptedException {
        theardPoolTest();
//        theardPoolTest2();

    }

    //方式一  线程处理固定集合处理
    public static void theardPoolTest() throws InterruptedException {
        List<String> testList = new ArrayList<>(500001);
        for (int i = 0; i < 500001; i++) {
            testList.add(i+"");
        }
        /**
         * Executors.newFixedThreadPool(有参)创建固定大小的线程池
         * 特点:可控制并发的线程数,超出的线程会在等待队列中等待
         *Executors.newCachedThreadPool();创建一个可缓存的线程池
         * 特点若线程超过处理所需,会在线程空闲时回收,若线程数无法满足任务数则创建新的线程,
         * 适用于短时间高并发,消耗资源大
         * Executors.newScheduledThreadPool(5);延迟线程
         */

        //集合分段
        int listSize = 10000;//每个集合分100条数据
        int size = testList.size();//集合总大小
        int poolList = size / listSize + 1;//线程池数量
        //创建固定大小的线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(poolList);
        //接收一个int型参数,表示要等待的线程个数
        CountDownLatch countDownLatch = new CountDownLatch(poolList);//等待其他线程完成
        //切分每个线程处理的集合转为线程安全集合
        List<String> strings = Collections.synchronizedList(new ArrayList<>());
        for (int i = 0; i < poolList; i++) {
            List<String> arryList = null;//定义每个线程要处理的集合
            if((i+1) == poolList){
                arryList = testList.subList(i*listSize,size);
            }else{
                arryList = testList.subList(i*listSize,(i+1)*listSize);
            }
            //开启线程
            List<String> finalArryList = arryList;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    //业务处理
                    for (String s: finalArryList) {
                        strings.add(s);
                        System.out.println("我是第"+s+"条数据");
                        System.out.println("我是被线程"+Thread.currentThread().getName()+"执行的");
                    }
                    System.out.println("我被减1");//等待数减1
                    countDownLatch.countDown();
                }
            });
        }
        //等待数减到0时开始执行表示主线程已执行完毕,释放阻塞
        countDownLatch.await();
        fixedThreadPool.shutdown();//关闭线程池
        while (true){
            //子线程执行完毕
            if (fixedThreadPool.isTerminated()){

                /*for(String s:strings){//测试500条数据全部放了进去且不规律
                    System.out.println("测试数据"+s);
                }*/
                System.out.println("数据大小"+strings.size());
                break;
            }
        }
    }

    //方式2 随机分配线程执行的数据
    public static void theardPoolTest2() throws InterruptedException {
        List<String> testList = new ArrayList<>(50000);
        for (int i = 0; i < 500000; i++) {
            testList.add(i + "");
        }
        /**
         * Executors.newFixedThreadPool(有参)创建固定大小的线程池
         * 特点:可控制并发的线程数,超出的线程会在等待队列中等待
         *Executors.newCachedThreadPool();创建一个可缓存的线程池
         * 特点若线程超过处理所需,会在线程空闲时回收,若线程数无法满足任务数则创建新的线程,
         * 适用于短时间高并发,消耗资源大
         * Executors.newScheduledThreadPool(5);延迟线程
         */

        //集合分段
        int listSize = 10000;//每个集合分100条数据
        int size = testList.size();//集合总大小
        int poolList = size / listSize + 1;//线程池数量
        //创建固定大小的线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(poolList);
        //切分每个线程处理的集合
        List<String> strings = Collections.synchronizedList(new ArrayList<>());
        for (int i = 0; i < testList.size(); i++) {
            final int finalI = i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    strings.add("s" + finalI);
                    System.out.println("我是第" + finalI + "条数据");
                    System.out.println("我是被线程" + Thread.currentThread().getName() + "执行的");
                }
            });
        }
        fixedThreadPool.shutdown();//关闭线程池
        while (true) {
            //子线程执行完毕
            if (fixedThreadPool.isTerminated()) {
                System.out.println("线程已全部执行完毕");
                /*for(String s:strings){//测试500条数据全部放了进去且不规律
                    System.out.println("测试数据"+s);
                }*/
                System.out.println("数据大小" + strings.size());
                break;
            }

        }
    }
}