Java:List分组<将原来的集合进行指定分组,分批运行>

目前List分组主要运用数据分组线程分批

1、分组公共类 

public class ListsUtils {

	/**
	 * 将一组数据平均分成n组
	 *
	 * @param source 要分组的数据源
	 * @param n      平均分成n组
	 * @param <T>
	 * @return
	 */
	public static <T> List<List<T>> averageAssign(List<T> source, int n) {
		List<List<T>> result = new ArrayList<>();
		int remainder = source.size() % n;  //(先计算出余数)
		int number = source.size() / n;  //然后是商
		int offset = 0;//偏移量
		for (int i = 0; i < n; i++) {
			List<T> value = null;
			if (remainder > 0) {
				value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
				remainder--;
				offset++;
			} else {
				value = source.subList(i * number + offset, (i + 1) * number + offset);
			}
			result.add(value);
		}
		return result;
	}

	/**
	 * 将一组数据固定分组,每组n个元素
	 *
	 * @param source 要分组的数据源
	 * @param n      每组n个元素
	 * @param <T>
	 * @return
	 */
	public static <T> List<List<T>> fixedGrouping(List<T> source, int n) {
		if (null == source || source.size() == 0 || n <= 0)
			return null;
		List<List<T>> result = new ArrayList<>();
		int sourceSize = source.size();
		int size = (source.size() / n) + 1;
		for (int i = 0; i < size; i++) {
			List<T> subset = new ArrayList<T>();
			for (int j = i * n; j < (i + 1) * n; j++) {
				if (j < sourceSize) {
					subset.add(source.get(j));
				}
			}
			result.add(subset);
		}
		return result;
	}


	/**
	 * 将一组数据固定分组,每组n个元素
	 *
	 * @param source 要分组的数据源
	 * @param n      每组n个元素
	 * @param <T>
	 * @return
	 */
	public static <T> List<List<T>> fixedGrouping2(List<T> source, int n) {
		if (null == source || source.size() == 0 || n <= 0)
			return null;
		List<List<T>> result = new ArrayList<>();
		int remainder = source.size() % n;
		int size = (source.size() / n);
		for (int i = 0; i < size; i++) {
			List<T> subset = source.subList(i * n, (i + 1) * n);
			result.add(subset);
		}
		if (remainder > 0) {
			List<T> subset = source.subList(size * n, size * n + remainder);
			result.add(subset);
		}
		return result;
	}

	/**
	 * 指定数字转换为集合
	 *
	 * @param number
	 * @return
	 */
	public static List<Integer> fixedList(int number) {
		List<Integer> list = Lists.newArrayList();
		for (int i = 1; i <= number; i++) {
			list.add(i);
		}
		return list;
	}

	/**
	 * 指定数字转换为集合
	 * @param minInt
	 * @param maxInt
	 * @return
	 */
	public static List<Integer> fixedMinMaxList(int minInt, int maxInt) {
		List<Integer> list = Lists.newArrayList();
		for (int i = minInt; i <= maxInt; i++) {
			list.add(i);
		}
		return list;
	}

	/**
	 * 二维集合
	 *
	 * @param number
	 * @param number2
	 * @return
	 */
	public static List<String> fixedList(int number, int number2) {
		List<String> list = Lists.newArrayList();
		for (int i = 1; i <= number; i++) {
			for (int k = 1; k <= number2; k++) {
				list.add(i + "-" + k);
			}
		}
		return list;
	}

	/**
	 * 获取时间分组
	 *
	 * @return
	 */
	public static Map<Integer, Integer> getTimesGroup() {
		Map<Integer, Integer> map = Maps.newHashMap();
		int table = 10;
		int year = 1990;
		for (int i = 1; i <= table; i++) {
			if (i > 1 && i <= 8) {
				for (int k = 0; k < 3; k++) {
					map.put(year++, 100 + i);
				}
			} else if (i > 8) {
				for (int k = 0; k < 2; k++) {
					if (i > 9) {
						map.put(year++, 1000 + i);
					} else {
						map.put(year++, 100 + i);
					}
				}
			} else {
				for (int k = 0; k < 10; k++) {
					map.put(year++, 100 + i);
				}
			}
		}
		return map;
	}

	/**
	 * 根据已有数据进行数字分组
	 * @param list
	 * @return
	 */
	public static Map<String, Integer> getNumberGroup(List<Long> list) {
		Map<String, Integer> map = Maps.newHashMap();
		list = list.stream().distinct().collect(Collectors.toList());
		Collections.sort(list);
		List<Long> list2 = Lists.newArrayList();
		List<Long> list3 = Lists.newArrayList();
		for (int i = 0; i < list.size(); i++) {
			StringBuffer key = new StringBuffer();
			if (i % 2 == 0) {
				list2.add(list.get(i));
			} else {
				list3.add(list.get(i));
			}
		}
		if (list.size() % 2 != 0) {
			list3.add(Collections.max(list));
		}
		for (int i = 0; i < list2.size(); i++) {
			map.put(list2.get(i) + "~" + list3.get(i), 0);
		}
		return map;
	}

	/**
	 * 获取多个list最大的size
	 * @param lists
	 * @return
	 */
	public static Integer getMaxSize(List<?>... lists) {
		if (ObjectUtils.isEmpty(lists)) {
			return 0;
		}
		List<Integer> maxSizeList = new ArrayList<>();
		for (List<?> list : lists) {
			maxSizeList.add(ObjectUtils.isEmpty(list) ? 0 : list.size());
		}
		return ObjectUtils.isEmpty(maxSizeList) ? 0 : Collections.max(maxSizeList);
	}

	/**
	 * 填充空值
	 * @param list
	 * @param maxSize
	 * @param <T>
	 * @return
	 */
	public static <T> List<T> fillValue(List<T> list, int maxSize) {
		if(list.size() < maxSize){
			for (int i = 0; i < maxSize-list.size() +1; i++) {
				list.add(null);
			}
		}
		return list;
	}

}

2、关键代码

private final int MAX_GROUP_NUMBER = 15;
private final int MAX_THREAD_POOL_NUMBER = 150;
private final ExecutorService executorService = Executors.newFixedThreadPool(MAX_THREAD_POOL_NUMBER);

// 获取页数-向上取整
Double num = Math.ceil(data.getDouble("total") / 20);
int pageNumber = num.intValue();
List<Integer> integerList = ListsUtils.fixedList(pageNumber);
List<List<Integer>> groupList = ListsUtils.fixedGrouping(integerList, MAX_GROUP_NUMBER);
CountDownLatch countDownLatch = new CountDownLatch(groupList.size());


groupList.forEach(list->{
    executorService.submit(() -> {
        list.forEach(i-> {
			try {
				// 关键代码..............
				Thread.sleep(200);
			} catch (Exception ex) {
				log.error("异常 >> " + ex.getMessage());
				ex.printStackTrace();
			} finally {
		    }
			log.info("第" + i + "页列表初始化");
		});
    countDownLatch.countDown();
});
try {
    // 调整频次
	Thread.sleep(1500);
} catch (InterruptedException e) { }
});
executorService.shutdown();
countDownLatch.await();
log.info("saveOrUpdateStock >> 所有的子线程都结束了!");

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java集合分批推送可以使用Java 8的Stream和Callable来实现。可以创建一个推送数据线程类PushDataTask,该类实现Callable接口,并重写call()方法。在call()方法中,可以通过查询数据库或其他方式获取需要推送的数据,并进行相应的处理。可以将数据分成多个批次进行推送,每个批次的数据由一个PushDataTask线程负责推送。在推送过程中,可以根据推送结果更新推送标识。 以下是一个简单的示例代码,演示了如何使用Java 8的Stream和Callable来实现集合分批推送: ``` import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; class PushDataTask implements Callable<Integer> { private List<PushProcess> pushProcessList; public PushDataTask(List<PushProcess> pushProcessList) { this.pushProcessList = pushProcessList; } @Override public Integer call() throws Exception { int count = 0; for (PushProcess process : pushProcessList) { boolean isSuccess = pushUtil.sendRecord(process); if (isSuccess) { //推送成功 pushProcessMapper.updateFlagById(process.getId(), 1); count++; } else { //推送失败 pushProcessMapper.updateFlagById(process.getId(), 2); } } return count; } } // 分批推送方法 public void batchPush(List<PushProcess> pushProcessList, int batchSize) { ExecutorService executorService = Executors.newFixedThreadPool(batchSize); List<Future<Integer>> futures = new ArrayList<>(); for (int i = 0; i < pushProcessList.size(); i += batchSize) { List<PushProcess> batchData = pushProcessList.subList(i, Math.min(i + batchSize, pushProcessList.size())); Callable<Integer> task = new PushDataTask(batchData); Future<Integer> future = executorService.submit(task); futures.add(future); } int totalCount = 0; for (Future<Integer> future : futures) { try { int count = future.get(); totalCount += count; } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } executorService.shutdown(); System.out.println("总共推送成功:" + totalCount + "条数据"); } ``` 使用上述代码,可以将需要推送的数据列表pushProcessList进行分批处理,每个批次的大小由参数batchSize指定。通过调用batchPush方法,即可实现集合分批推送,并获得推送成功的总条数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值