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

相关推荐
码农颜5 小时前
5.4.1 锁分类
java·数据库·mysql
linux-hzh6 小时前
百日算法修炼 · Day 03
java·算法
不负岁月无痕7 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试
mister_guo7 小时前
Java线程池参数应该如何设置(ThreadPoolExecutor)
java
余额瞒着我当琳7 小时前
C++模板初阶与STL初探
android·java·c++
淡海水7 小时前
15-02-YooAsset面试篇-Unity架构设计与源码
java·unity·面试·c#·游戏引擎·yooasset
qq_448011167 小时前
C语言中的指针函数和函数指针
java·c语言·开发语言
weixin_BYSJ19878 小时前
springboot酒店管理系统--附源码27436
java·spring boot·python·随机森林·贪心算法·eclipse·django
2401_894915538 小时前
GEO 源码部署如何实现精准地域分发?核心配置参数深度讲解
java·运维·服务器·后端·开源
evans在进步9 小时前
LeetCode 2 两数相加:链表模拟加法,Java 图解进位过程
java·leetcode·链表