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()方法。

相关推荐
明湖起风了3 分钟前
mqtt消费堆积
java·jvm·windows
Free Tester21 分钟前
如何判断 LeakCanary 报告的严重程度
java·jvm·算法
清心歌1 小时前
CopyOnWriteArrayList 实现原理
java·开发语言
Java成神之路-1 小时前
通俗易懂理解 Spring MVC 拦截器:概念、流程与简单实现(Spring系列16)
java·spring·mvc
zhanghongbin011 小时前
AI 采集器:Claude Code、OpenAI、LiteLLM 监控
java·前端·人工智能
计算机毕设vx_bysj68691 小时前
【免费领源码】77196基于java的手机银行app管理系统的设计与实现 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·mysql·智能手机·课程设计
忘梓.1 小时前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u1 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
星河耀银海1 小时前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++
格鸰爱童话2 小时前
向AI学习项目技能(五)
java·学习