java 线程池实现多线程处理list数据

newFixedThreadPool线程池实现多线程

复制代码
		List<PackageAgreementEntity> entityList = new CopyOnWriteArrayList<>();
        //多线程   10个线程
        //int threadNum = 10;
        int listSize = 300;
        List<List<PackageAgreementDto>> splitData = Lists.partition(packageAgreementList, listSize);
        //CountDownLatch latch = new CountDownLatch(splitData.size());
        //声明线程池对象
        ExecutorService touchWorker = Executors.newFixedThreadPool(splitData.size());
        //不加这个会导致线程不安全,丢失数据
        Semaphore semaphore = new Semaphore(splitData.size());//定义几个许可
        List<PackageAgreementErroDto> errorList2 = new CopyOnWriteArrayList();

        for (int i = 0; i < packageAgreementList.size(); i++) {
            final  int j = i;
            semaphore.acquire();
            touchWorker.execute(()->{
                try {
                        logger.info(Thread.currentThread().getName()+ j);
                        logger.info("数据第几条:" + j);
                        //校验物料、供应商、ou、地点信息是否存在
                        packageAgreementService.checkMultiData(packageAgreementList.get(j), j ,user, dateFormat,  errorList2, entityList);

                        semaphore.release();
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            });
        }
        //每隔10s检测线程是否执行结束
        boolean flag = touchWorker.awaitTermination(10, TimeUnit.SECONDS);
         if(!flag){
            logger.info("一揽子协议价格录入完成!");
        }

需要注意的问题点,多线程处理List数据可能发生线程不安全,

引入CopyOnWriteArrayList,Semaphore解决,或者加锁解决问题;所有线程执行完毕后再进行后续业务的处理,引入awaitTermination()方法。

相关推荐
_周游几秒前
Java8 API文档搜索引擎_3.搜索模块(实现细节)
java·搜索引擎·intellij-idea
人道领域5 分钟前
SSM从入门到入土(Spring Bean实例化与依赖注入全解析)
java·开发语言·spring boot·后端
long3169 分钟前
Z算法(线性时间模式搜索算法)
java·数据结构·spring boot·后端·算法·排序算法
毕设源码-赖学姐10 分钟前
【开题答辩全过程】以 基于Java web的宠物领养系统的设计与实现为例,包含答辩的问题和答案
java·开发语言·宠物
瑞雪兆丰年兮16 分钟前
[从0开始学Java|第十三天]面向对象进阶(static&继承)
java·开发语言
小楼v18 分钟前
如何实现AI生成应用部署功能
java·后端·ai·部署
望未来无悔20 分钟前
系统学习算法 专题十九 优先级队列(堆)
java·算法
小虾米 ~21 分钟前
JAVA引用类型
java·开发语言
星辰_mya22 分钟前
Elasticsearch之中
java·服务器·数据库
fengxin_rou26 分钟前
[Redis从零到精通|第三篇]:缓存更新指南
java·数据库·redis·spring·缓存