【Java】将一个List拆分使用线程池多线程运行

需求:

将点位List(pointList)分成每100个点为一组,循环每一组,每组开启100个线程进行获取数据,且前一组100个线程执行完毕后才进行下一组。

复制代码
// 将list分割成每100个为一个子列表
List<List<DynaBean>> subLists = splitListIntoChunks(pointList, THREAD_POOL_SIZE);

for (List<DynaBean> subList : subLists) {

	// 创建一个Future集合来保存所有的Future对象
	List<Future<?>> futures = new ArrayList<>();

	/**
	* 创建一个固定大小的线程池。
	* 线程池的大小被设置为THREAD_POOL_SIZE,这个大小是根据预先定义好的常量来确定的。
	* 这样做的目的是为了限制同时执行的任务数量,避免过多的任务导致系统资源耗尽。
	*/
	ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);

	/**
	* 创建一个计数器 latch,其计数初始值为subList.size()。
	* 这个 latch 的作用是用于等待所有线程任务完成。
	* 当线程池中的每个线程任务完成时,latch 的计数器会递减。
	* 当计数器减到0时,表示所有线程任务都已完成,此时主程序可以继续执行。
	*/
	CountDownLatch latch = new CountDownLatch(subList.size());


	for(DynaBean bean : subList){
		Future<?> future = executor.submit(() -> {
			try{
			//do something
			}finally {
           		latch.countDown();
            }
		});
		futures.add(future);
	}

	// 等待所有任务完成
	for (Future<?> future : futures) {
		try {
			future.get();
		} catch (InterruptedException | ExecutionException e) {
			throw new RuntimeException("Error processing tasks", e);
		}
	}

	// 关闭线程池
	executor.shutdown();
	latch.await();
}

/**
     * 将一个DynaBean列表分割成多个指定大小的块。
     * 这个方法用于将一个大列表分解成多个小列表,每个小列表的大小不超过指定的块大小。
     * 如果最后一个块的大小小于指定的块大小,则该块将包含列表的剩余元素。
     *
     * @param list 待分割的DynaBean列表。
     * @param chunkSize 每个块的目标大小。
     * @return 一个包含分割后的DynaBean列表的列表。
     */
    private static List<List<DynaBean>> splitListIntoChunks(List<DynaBean> list, int chunkSize) {
        if (chunkSize <= 0) {
            throw new IllegalArgumentException("Chunk size must be positive.");
        }

        List<List<DynaBean>> chunks = new ArrayList<>();
        final int totalChunks = (int) Math.ceil((double) list.size() / chunkSize);

        for (int i = 0; i < totalChunks; i++) {
            int start = i * chunkSize;
            int end = Math.min(start + chunkSize, list.size());
            chunks.add(new ArrayList<>(list.subList(start, end)));
        }

        return chunks;
    }
相关推荐
sukalot7 小时前
windows 驱动实例分析系列: wireguard-nt驱动分析-driver篇(一)
windows·驱动开发
AI人工智能+电脑小能手7 小时前
大白话说Java设计模式-38-迭代器模式(业务实战篇)
java·设计模式·迭代器模式·stream·遍历封装·集合通用·分页遍历
QQ_21696290967 小时前
【源码编号:project86570】SpringBoot电影院在线选座售票系统:电影排片、在线选座、订单购票、后台管理完整实战
java·spring boot·后端
谢亮_vipxieliang7 小时前
手机号验证技术方案:号段规则与正则表达式
java·服务器·spring boot·正则表达式·hibernate
百事牛科技7 小时前
Excel部分单元格禁止修改:锁住该锁的,放开该放的
windows·excel
wang09077 小时前
自己动手写一个tomcat之7监听器和过滤器
java·tomcat
梅孔立7 小时前
Pi-Agent 终极极简配置文档(Java+Vue+Python爬虫 4-5千文件项目)
java·vue.js·python
Query*7 小时前
Agent 开发之项目 AI Native 化:通过大模型与 RAG 赋予产品智能能力
java·人工智能·ai
孫治AllenSun7 小时前
【LangChain4J-03】Springboot 项目搭建框架
java·spring boot·后端
君顾17 小时前
AI新零售线上商城系统实战:架构设计与开发全流程指南
java·开发语言·零售