java8 CompletableFuture.supplyAsync +线程池 实现多线程处理

public void dealGovernanceStrategyNew(List<StrategyStreamOperation> commonAll, StrategyDetail strategyDetail, List<String> instanceList) {
	if (Objects.isNull(strategyDetail.getType()) && Objects.isNull(strategyDetail.getRetainNum())) {
		// 500一组分批处理
		List<List<String>> lists = ListSplitUtil.splitList(instanceList, 500);
		// 对于集合写操作:synchronizedList 相对于Vector 、CopyOnWriteArrayList性能更佳。 读操作建议CopyOnWriteArrayList
		// 多线程批量处理数据(500一组) 这里使用java8 CompletableFuture.supplyAsync实现多线程处理
		List<StrategyStreamOperation> operationList = Collections.synchronizedList(new ArrayList<>());
		// 手动创建线程池
		ExecutorService executorService =  new ThreadPoolExecutor(lists.size(), lists.size(), 0, TimeUnit.MILLISECONDS,
				new LinkedBlockingQueue<Runnable>(1024), new ThreadPoolExecutor.AbortPolicy());
		lists.stream().forEach((List<String> item) ->{
			CompletableFuture<List<StrategyStreamOperation>> cf = CompletableFuture.supplyAsync(()->{
				// 持续天数的峰值判断的
				List<StrategyStreamOperation> futureList = getStrategyByCommon();
				return futureList;
			}, executorService);
			try {
				// 获取线程执行结果
				operationList.addAll(cf.get());
			} catch (InterruptedException e) {
				log.error("从线程中获取执行结果失败", e);
			} catch (ExecutionException e) {
				log.error("从线程中获取执行结果失败", e);
			}
		});
		// 关闭线程池,不再接收新任务
		executorService.shutdown();
		commonAll.addAll(operationList);
	}
}
posted @ 2021-07-21 14:37  王岳阳  阅读(5529)  评论(0编辑  收藏  举报