public boolean processForDataShard(List<ListType> list, ParallelComputingProcess<ListType, ParameterType> process, int dataShardSize, ParameterType obj) {
		if (list == null || list.size() < 1 || process == null) {
			return false;
		}
		int minShardSize = 2000;// 每个线程最小处理条数
		dataShardSize = dataShardSize < minShardSize ? minShardSize : dataShardSize;

		long startTime = System.currentTimeMillis();
		// 将list分块后丢给多个线程，并行处理
		int listSize = list.size();// 总数
		int threadNum = listSize / dataShardSize;// 启动线程数
		int dataMon = listSize % dataShardSize;// 数据余数
		int threadFullNum = threadNum + (dataMon > 0 ? 1 : 0);// 总共需要启动线程数
		final CountDownLatch latch = new CountDownLatch(threadFullNum);// 同步辅助类
		final ParallelComputingProcess<ListType, ParameterType> processShard = process;
		final ParameterType object = obj;

		if (threadNum > 0) {
			for (int i = 0; i < threadNum; i++) {
				int fromIndex = i * dataShardSize;
				int toIndex = ((i + 1) * dataShardSize);
				final List<ListType> listShard = list.subList(fromIndex, toIndex);
				final int threadId = i;
				Runnable t = new Runnable() {
					@Override
					public void run() {
						job(threadId, listShard, processShard, object);
						latch.countDown();// 计数减一
					}
				};
				pool.execute(t);
			}
		}

		if (dataMon > 0) {
			int fromIndex = listSize - dataMon;
			int toIndex = listSize;
			final List<ListType> listShard = list.subList(fromIndex, toIndex);
			final int threadId = threadNum;
			Runnable t = new Runnable() {
				@Override
				public void run() {
					job(threadId, listShard, processShard, object);
					latch.countDown();// 计数减一
				}
			};
			pool.execute(t);
		}

		logger.info(serviceName + "-processForDataShard START (thread count:" + threadFullNum + ",Sharding size:" + dataShardSize + ",total count：" + listSize + ")");
		try {
			latch.await();// 等待子线程结束
		} catch (InterruptedException e) {
			logger.error(serviceName + "-processForDataShard ERROR!", e);
			e.printStackTrace();
			return false;
		}
		logger.info(serviceName + "-processForDataShard FINISH (thread count:" + threadFullNum + ",Sharding size:" + dataShardSize + ",total count：" + listSize + ") use time " + (System.currentTimeMillis() - startTime) + "ms");
		return true;
	}