线程池批量处理数据

	public void runUpdate(List shoplist) throws Exception{
		// 开始时间
        long start = System.currentTimeMillis();
		  // 每5000条数据开启一条线程
        int threadSize = 5000;
        // 总数据条数
        int dataSize = shoplist.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 = shoplist.subList(threadSize * i, dataSize);
            } else {
                cutList = shoplist.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 {
                   //线程要执行的方法
                	sysSiteMapUrlService.batchAdd(listStr);
                    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)