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

相关推荐
叫致寒吧16 小时前
Tomcat详解
java·tomcat
S***267520 小时前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
马剑威(威哥爱编程)20 小时前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
JIngJaneIL20 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
V***u45321 小时前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
这是程序猿21 小时前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
i***t9191 天前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
k***08291 天前
【监控】spring actuator源码速读
java·spring boot·spring
麦麦鸡腿堡1 天前
Java_网络编程_InetAddress类与Socket类
java·服务器·网络
vx_dmxq2111 天前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php