当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/132943.html

相关文章:

  • Centos安装Docker
  • Unity启动项目无反应的解决
  • 2.3 opensbi: riscv: opensbi源码解析
  • 点破ResNet残差网络的精髓
  • Ubuntu服务器service版本初始化
  • re学习(33)攻防世界-secret-galaxy-300(脑洞题)
  • Mybatis Plus中使用LambdaQueryWrapper进行分页以及模糊查询对比传统XML方式进行分页
  • vue中push和resolve的区别
  • 详解RFC 3550文档-1
  • Go 与 Rust
  • Android Studio实现读取本地相册文件并展示
  • python的全局解释锁(GIL)
  • 小程序swiper一个轮播显示一个半内容且实现无缝滚动
  • 【自然语言处理】关系抽取 —— SimpleRE 讲解
  • 【O2O领域】Axure外卖订餐骑手端APP原型图,外卖众包配送原型设计图
  • DataGridView keydown事件无法在C#中工作
  • 【ElasticSearch】一键安装ElasticSearch与Kibana以及解决遇到的问题
  • 电商数据采集和数据分析
  • react 11之 router6路由 (两种路由模式、两种路由跳转、两种传参与接收参数、嵌套路由,layout组件、路由懒加载)
  • Golang 基础语法问答
  • 冠达管理:哪里查中报预增?
  • docker安装Oracle11gR2
  • unity 之 Input.GetMouseButtonDown 的使用
  • 链游再进化 Web3版CSGO来袭
  • WordPress用于您的企业网站的优点和缺点
  • ~600行ANSI C代码实现RISC-V CPU核
  • 【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用
  • 【C++】详解内存中的堆和栈
  • QCustomPlot横坐标为毫秒级的时间轴数据展示的实时刷新数据功能
  • STM32/AT32 MCO管脚输出时钟配置