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

线程池配置实现多线程快速处理批量数据

把 ArrayList 替换成线程安全的集合类,例如 CopyOnWriteArrayList。
CopyOnWriteArrayList 在进行写操作时会创建一个新的数组副本,以此保证线程安全。

否则会报错:
java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: 11
表明在代码里有尝试访问数组中索引为 11 的元素,然而数组的长度小于 12(因为数组索引从 0 开始)。错误栈显示异常出现在 java.util.ArrayList.add 方法处,这可能意味着在往 ArrayList 里添加元素时,底层数组的索引越界了。
原因:多线程修改 ArrayList:ArrayList 并非线程安全的类。多个线程同时对 ArrayList 进行修改操作,就可能会造成数组越界异常。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.CopyOnWriteArrayList;public class VendorAdminServiceImpl {private ExecutorService executorService = Executors.newFixedThreadPool(10);public void pageSearchList() {List<Future<?>> futures = new ArrayList<>();//统计执行时长StopWatch sw = StopWatch.createStarted();// 使用 CopyOnWriteArrayList 代替 ArrayListList<String> resultList = new CopyOnWriteArrayList<>();// 模拟任务List<String> dataList = new ArrayList<>();for (int i = 0; i < 100; i++) {dataList.add("Data " + i);}AtomicInteger counter = new AtomicInteger(0);dataList.forEach(data -> {futures.add(executorService.submit(() -> {// 模拟处理逻辑resultList.add(data);counter.incrementAndGet();}));});try {// 阻塞当前线程,直到更新操作完成// 等待所有更新操作完成for (Future<?> future : futures) {try {future.get();} catch (InterruptedException | ExecutionException e) {e.printStackTrace();throw new RuntimeException("页面数据查询失败", e);}}} catch (Exception e) {e.printStackTrace();} finally {// 关闭线程池executorService.shutdown();}sw.stop();log.info("数据组装耗时:{}", sw.getTime());System.out.println("Total processed: " + counter.get());System.out.println("Result list size: " + resultList.size());//可以return resultList;}public static void main(String[] args) {VendorAdminServiceImpl service = new VendorAdminServiceImpl();service.pageSearchList();}
}
http://www.xdnf.cn/news/145873.html

相关文章:

  • 动态ip与静态ip的概念、区别、应用场景
  • 统计文件中单词出现的次数并累计
  • 【玩泰山派】7、玩linux桌面环境xfce - (4)使用gstreamer
  • 点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法
  • 【DE-III】基于细节增强的模态内和模态间交互的视听情感识别
  • LabVIEW轨道交通动力系统性能监控
  • Spring 与 ActiveMQ 的深度集成实践(一)
  • 佳博票据和标签打印:Web网页端与打印机通信 | iOS
  • freecad参数化三维模型装配体解析至web端,切换参数组或修改参数
  • 【维护窗口内最值+单调队列/优先队列】Leetcode 239. 滑动窗口最大值
  • 【数据结构】红黑树原理及实现
  • 如何在奥维互动地图里加载星图云卫星地图
  • 【文献阅读】建立高可信度的阴性样本,改进化合物-蛋白质相互作用预测
  • 《WebGIS之Vue零基础教程》(5)计算属性与侦听器
  • 数据库对比
  • C语言实现贪心算法
  • 嵌入式 C 语言面试核心知识点全面解析:基础语法、运算符与实战技巧
  • 企业网站html源代码 企业网站管理源码模板
  • linux centos7 python3安装
  • docker 代理配置冲突问题
  • 数据结构------C语言经典题目(6)
  • spring OncePerRequestFilter 作用
  • Zynq 7000的PS侧DDR3地址范围及相关信息
  • 《使用 Cesium 加载静态热力图显示的实现步骤》
  • 【LeetCode 热题 100】滑动窗口最大值 / 最小覆盖子串 / 轮转数组 / 缺失的第一个正数
  • 如何创建和推广高质量内容:SEO与内容营销的成功指南
  • Low Poly 风格 | 飞机飞行可视化系统
  • Vue3 上传后的文件智能预览(实战体会)
  • React 实现爱心花园动画
  • 漏洞管理体系:从扫描评估到修复验证的全生命周期实践