java多线程处理List数据

 @Test
    void contextLoads() throws Exception {
        List list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            list.add(i + ",");
        }
        thred(list);
    }
 public void thred(List list) throws InterruptedException, ExecutionException {
        long start = System.currentTimeMillis();
        // 每500条数据开启一条线程
        int threadSize = 5;
        // 总数据条数
        int dataSize = list.size();
        // 线程数
        int threadNum = dataSize / threadSize + 1;
        // 定义标记,过滤threadNum为整数
        boolean special = dataSize % threadSize == 0;
        // 创建一个线程池
        ExecutorService exec = Executors.newFixedThreadPool(threadNum);
        // 定义一个任务集合
        List> tasks = new ArrayList>();
        Callable task = null;
        List cutList = null;
        // 确定每条线程的数据
        for (int i = 0; i < threadNum; i++) {
            if (i == threadNum - 1) {
                if (special) {
                    break;
                }
                cutList = list.subList(threadSize * i, dataSize);
            } else {
                cutList = list.subList(threadSize * i, threadSize * (i + 1));
            }
        // System.out.println("第" + (i + 1) + "组:" + cutList.toString());
            final List listStr = cutList;
            task = new Callable() {
                @Override public
                Integer call() throws Exception {
                   
                    System.out.println(Thread.currentThread().getName() + "线程:" + listStr + LocalDateTime.now().toString());
                    return 1;
                }
            };

        // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
            tasks.add(task);
        }
        List> results = exec.invokeAll(tasks);
        for (Future future : results) {
            System.out.println(future.get());
        }
        // 关闭线程池
        exec.shutdown();
        System.out.println("线程任务执行结束");
        System.err.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
    }

你可能感兴趣的:(多线程,java,开发语言)