多线程快速处理List集合(结合线程池的使用)

Java——使用多线程从list中不重复地取出数据并进行处理,给多线程任务添加单项任务计时和总耗时 大部分的业务都不是独立运行的,会有参数传递到业务中,如果需要多线程调用的业务有主线程的参数需要传递过去,就可以把参数写在实现了Runnable接口的业务类的私有属性中,用业务类的构造方法传参。在业务里,使用多个线程并行处理业务能够极大的加快处理速度,但是如果我们需要明确掌握每次处理业务的耗时,和所有业务处理完成的总耗时,就可以通过CountDownLatch来帮我们实现。把处理数据的方法写在处理类中重写的Runnable接口的run()方法中。在方法中调用了属性num。添加了以上属性的构造方法。 阅读详情

有一个大List集合,遍历进行一些耗时操作,不能达到性能要求,查询日志,单个任务虽然有不少数据库和第三方API请求,比较耗时,但返回效率尚可,所以优先采用多线程方式进行处理并行请求数据库和第三方API,因为处理完还要对list所属的数据进行操作,所以,线程池多线程处理要等待全部处理完。

上代码:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class testList {
    public static void main(String [] args) {
        List<String> list = new ArrayList<>();
        for (int i = 1; i <= 900; i++) {
            list.add("a"+i);
        }
        ExecutorService touchWorker = Executors.newFixedThreadPool(9, Executors.defaultThreadFactory());
        int size = list.size();
        long start=System.currentTimeMillis();
        if (size > 100) {
            int batch = size % 100 == 0 ? size / 100 : size / 100 + 1; //将List集合切片
            for (int j = 0; j < batch; j++) {
                int end = (j + 1) * 100;
                if (end > size) {
                    end = size;
                }
                List<String> subList = list.subList(j * 100, end);//截取每个小分片的数据 第一次是0-100的数据以此类推
                touchWorker.execute(()-> sleepTest(subList));//让线程池执行工作
            }
            touchWorker.shutdown();//关闭线程池
            while (true) {
                if (touchWorker.isTerminated()) {
                    break;
                }
            }
        } else {
            sleepTest(list);
        }
        long end =System.currentTimeMillis();
        System.out.println((end-start)/1000);
    }

    private static void sleepTest(List<String> subList) {
        for (String i : subList) {
            try {
                //耗时操作
                System.out.println("######" + i + "######" + Thread.currentThread().getName());
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

执行结果:
一共耗时10s;
在这里插入图片描述可以看到我上面是让每个操作都休眠0.1s,然后开了9个线程,分片也正好是分了9个片,所以每个线程都拿到100条数据进行处理,这是最快的方式,如果固定线程池开5个线程的话,还是同样的操作,那么看现在的执行时间:
在这里插入图片描述
用时20s,也可以想到,前面5个处理500条用了10秒,后面4个线程处理剩下的400条也耗时10秒。所以在实际的工作中可以动态的根据分片的大小调整线程池里线程的数量 。

void shutdown()
启动一次顺序关闭,执行以前提交的任务,但不接受新任务。若已经关闭,则调用没有其他作用。
抛出:SecurityException - 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持RuntimePermission(“modifyThread”)),或者安全管理器的 checkAccess 方法拒绝访问。

boolean isTerminated()
若关闭后所有任务都已完成,则返回true。注意除非首先调用shutdown或shutdownNow,否则isTerminated永不为true。返回:若关闭后所有任务都已完成,则返回true。

至于用哪种线程池的话可以看下面
参考文章里

参考文章:
https://blog.youkuaiyun.com/qililong88/article/details/114320641

四种常见线程池介绍及使用举例

使用无限大小线程池 newCachedThreadPool 可能遇到的问题

java多线程:使用newFixedThreadPool方法创建指定线程数量的线程池

整理收集几种多线程分段处理list集合的方法

Java中终止(销毁)线程的方法

线程池 处理 list 集合 @Test public void testThreade() throws ExecutionException, InterruptedException { long start = System.currentTimeMillis(); List<String> list = new ArrayList<>(); ... 阅读详情

相关推荐

我崩溃了!mysql存储过程返回集合

02 JVM 线程 JVM内存区域 JVM运行时内存 垃圾回收与算法 JAVA四种引用类型 GC分代收集算法 VS 分区收集算法 GC垃圾收集器 JAVA IO/NIO JVM类加载器 03 JAVA集合 接口继承关系和实现 LIST SET MAP 04 JAVA多线程并发 JAVA并发知识库 JAVA线程实现/创建方式 4种线程池 线程生命周期(状态) 终止线程4种方式 sleep与wait区别 start与run区别 JAVA后台线程 JAVA锁 线程基本方法 线程上下文切换 同步锁与死

m0_57700563的博客 445

多线程处理List集合数据

多线程处理拆分后的小集合,注意ArrayList不是线程安全的

zhanghe687的博客 2064

C#多线程与网络编程实战指南

多线程编程是现代软件开发中提升性能的核心技术,通过并行执行任务充分利用多核CPU资源。C#提供了System.Threading命名空间实现线程管理,从基础的Thread类到高效的线程池(ThreadPool)机制,再到基于任务的异步模式(TAP)。在网络编程领域,Socket API实现了底层通信,而HttpClient等高级封装简化了网络请求。结合LINQ的数据处理能力,开发者可以构建高性能的并发网络应用。本文通过实际代码示例,详细讲解线程同步、异步Socket、PLINQ查询等关键技术,帮助开发者掌握

Eric.Net的专栏 337

java线程池分段处理list集合

java线程池分段批量处理集合数据

qq_36005400的博客 1909

Java高级面试核心:JVM、并发与集合源码深度解析与实战

在Java开发领域,JVM内存管理、并发编程和集合框架是构建高性能、高可靠应用的核心基础。理解JVM内存模型与垃圾回收机制,是优化应用性能和排查线上内存问题的关键;掌握并发编程原理与线程池调优,能有效提升系统吞吐量与稳定性;深入集合框架源码细节,如HashMap的哈希冲突解决与扩容策略,有助于编写高效且健壮的代码。本文聚焦Java高级工程师面试中的高频考点,通过解析JVM对象创建与GC Roots、synchronized锁升级与ConcurrentHashMap演进等核心原理,结合OOM异常排查、线程池参

weixin_30813225的博客 824

Python实现文件密码破解:字典攻击与多线程优化实战

密码安全是信息安全的基础概念,其核心原理在于通过验证机制保护数据隐私。在技术实现层面,字典攻击作为一种高效的密码破解方法,通过利用常见密码模式而非穷举所有组合,显著提升了破解效率。这种技术的工程价值在于帮助安全人员评估密码强度,并在合法数据恢复场景中发挥作用。Python凭借其丰富的库生态,成为实现此类工具的理想选择,其中多线程并发处理能大幅提升破解速度。本文聚焦于使用Python的pikepdf和zipfile库,结合tqdm进度条,构建一个支持PDF和ZIP文件的密码破解脚本,通过字典攻击与多线程优化,

weixin_33912638的博客 441

List集合分批多线程处理

mybatis批量插入或者删除限制1000条记录,分批处理 private void close (List<PdfDataTest> closeList){ //限制次数 int limitNum=1000; if (closeList.size()<limitNum){ //执行代码逻辑 ...

人生就像一场戏 6047

Java List转String性能优化与最佳实践:从线上告警到七种方案深度解析

在Java开发中,字符串拼接与集合处理是基础且高频的操作,其性能表现直接影响应用响应时间和系统吞吐量。从底层原理看,字符串不可变性与集合迭代机制决定了不同拼接方式的效率差异。高效的字符串处理技术能显著提升系统性能,尤其在日志记录、数据序列化和查询条件构建等应用场景中至关重要。本文聚焦于List转String这一常见需求,深入剖析了包括StringBuilder、StringJoiner和Stream API在内的多种实现方案,并结合线上告警案例,探讨如何在高并发环境下避免性能陷阱,为开发者提供从基础到进阶的

weixin_34025151的博客 602

技术总结:Java泛型与集合框架的结合

通过实践案例的分析,我们可以看到Java泛型与集合框架的结合应用可以提高代码的灵活性和可扩展性,降低类型错误的发生,提高程序的性能和稳定性。综上所述,Java泛型与集合框架的结合应用可以提高代码的灵活性和可扩展性,降低类型错误的发生,提高程序的性能和稳定性。在信息技术快速发展的今天,Java语言的应用越来越广泛,泛型技术和集合框架作为Java语言的重要支柱,对于提高编程效率和质量起着至关重要的作用。集合框架是Java中用于管理集合数据的工具,提供了丰富的集合类和方法,可以方便地操作和管理集合数据。

2501_90410679的博客 69

ANSYS Fluent 2023R2实战:用欧拉多相流模型搞定流化床模拟(附详细参数避坑)

本文详细解析了ANSYS Fluent 2023R2中欧拉多相流模型在流化床模拟中的应用,包括模型选择、材料属性设置、相间作用力配置及初始化技巧。特别针对高颗粒浓度工况提供参数优化方案,帮助工程师提升模拟精度与效率,适用于化工、能源等领域的流化床反应器设计。

weixin_30938149的博客 267

华为C语言笔试题(附答案)

华为C语言笔试题(附答案)     1、局部变量能否和全局变量重名?   答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "   局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。  

峰云四起 3031

Java集合、多线程知识点补充

Java中Map和Collection接口是所有集合框架的顶接口; Collection接口下有Set接口、List接口; Set接口主要实现类:HashSet、TreeSet、LinkedHashSet等; List接口主要实现类:ArrayList、LinkedList、Stack、Vector等 Map接口下是实现类:HashMap、TreeMap、HashTable、ConcurrentHashMap; ConcurrentHashMap和HahsTable的区别? 我们要先知道HashMap和Ha

CaiBirdHitGuai的博客 249

Zabbix华为交换机光衰告警

zabbix使用自动发现监控huawei网络设备光衰

qq_31651649的博客 4529

Java核心八股文:JVM、多线程与集合框架深度解析

Java作为企业级开发的主流语言,其核心知识点如JVM内存模型、多线程并发控制和集合框架设计,是开发者必须掌握的内功心法。JVM通过内存分区与GC算法平衡性能与资源消耗,多线程编程需要理解线程生命周期与锁机制,而集合框架的选型直接影响数据处理效率。这些基础原理不仅决定代码质量,更是解决高并发场景、内存泄漏等实际问题的关键。通过分析HashMap死循环、ArrayList扩容等典型案例,结合volatile关键字、ConcurrentHashMap等热词技术点,帮助开发者构建扎实的Java知识体系,提升系统调

weixin_33816946的博客 386

Apollo&Carla联合仿真基本操作

基于UE4开发的开源无人驾驶仿真器PythonAPI自动驾驶传感器(还有理想化的collision detection传感器)用于规划和控制的快速仿真地图生成交通场景(open scenario)仿真ROS集成自动驾驶baseline0.9.15新特性新的车型以及地图基于Omniverse的素材导入基于OSM的三维场景生成。

SLAM小土堆 3799

A Side Scan Sonar Image Denoising Algorithm Based on Compound of Fuzzy Weighted Average and Kalman F

Abstract 水下侧扫声纳图像的噪声来源:高斯噪声、脉冲、斑点噪声。 传统方法只能移除部分噪声,并且去噪后容易造成细节模糊。 本文在考虑到噪声的随机性以后,提出一种融合了模糊加权平均和卡尔曼滤波的去噪方法。 在最大化保留图像细节的基础上,同时去除高斯噪声和脉冲噪声 一.Introduction 由于海底环境和声波自身干涉的影响,声纳图像生成的图像难免会有噪点。声纳采集的图像通常会有高斯噪声、脉...

qq_44516871的博客 927

Java 集合

定义:集合框架是一套标准化的接口和类,用来操作一组对象。它将各种数据结构(如动态数组、链表、队列、集合等)转换为Java中的类,并为其定义统一的操作方式。作用简化编程:集合框架提供了一组常用的数据结构和算法,开发者无需重复编写基本的存储、查找、排序等操作。可扩展性:通过标准接口和抽象类,开发者可以轻松实现自定义的数据结构并与框架兼容。提高效率:集合框架中的许多实现都是高度优化的,适用于各种场景的性能需求(如快速查找、增删、排序等)。提高代码的可维护性。

m0_73837751的博客 1258

AAAI2024最佳解读|FontDiffuser One-Shot Font Generation via Denoising Diffusion with Multi-Scal

本文提出了一种名为FontDiffuser的基于扩散的单次字体生成方法,旨在通过去噪扩散模型生成模仿参考图像风格的字体,同时保留源图像的内容。尽管现有的字体生成方法在性能上取得了一定的进展,但在处理复杂字符和大风格变化时仍面临挑战。FontDiffuser通过引入多尺度内容聚合(MCA)模块,有效结合不同尺度的全局和局部内容线索,从而增强复杂字符的笔画保留能力。此外,文章还提出了一种风格对比细化(SCR)模块,用于风格表示学习,利用风格提取器从图像中分离风格,并通过精心设计的风格对比损失来监督扩散模型。

haimianxiaobao11的博客 1189

如何快速向数据库加入10万条数据

1、程序连接数据库,使用c3p0线程池; 2、程序使用线程池,多线程编程; 3、采用Fork/Join框架线程池(工作窃取(work-stealing)算法),更高效的多线程编程算法。 直接贴代码,代码举例中,近用小规模数据模拟大数据下的数据库批量插入操作。 1、数据库连接池 package com.example.jdbcConnection; import com.mchange.v2.c...

文武傲群雄,彳亍定江山 1267

图解B树的原理及操作

本文主要参考:https://blog.youkuaiyun.com/shenchaohao12321/article/details/83243314 1. B树 1.1 B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-

jinking01的专栏 3万+

[QMT量化交易小白入门]-四十九、中小盘策略是否还有未来,市值再平衡策略,年化收益率124%

该策略旨在通过定期再平衡持仓,保持投资组合中股票数量恒定(),并优先持有市值较小的股票。具体来说,策略每两天(period = 2)进行一次再平衡,根据当前市值对持仓进行调整,以实现微盘股的投资目标。中小市值策略对资金量要求有限制,资金量太大由于流动性不足,滑点可能较大,资金量太小,可能不能达到10-20只持仓,来分散风险,10-100w可能是比较理想的,后续可以根据波动率动态调仓,或波动率大于一定值时触发再平衡加入ROE或其他财务指标,或者研发投入强度大的专精特新企业,进行组合优化。

木头大左的博客 1183

JUC-线程池

线程池(Thread Pool)是一种基于池化思想管理线程的工具;优势重复利用已经创建的线程,降低频繁创建/销毁线程的开销任务到达时,无需创建线程可立即执行线程是稀缺资源,无限制创建会影响系统资源失衡,降低系统稳定性,使用线程池可以统一进行线程分配,调优,监控。如延时定时线程池。

qq_43572642的博客 358

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java List 完整知识体系(Java 版,面试全覆盖)

本文全面剖析Java List集合体系,从底层源码、设计思想到生产实践,涵盖核心实现类对比、线程安全机制、遍历方式优化及工具方法应用。主要内容包括: 架构体系:List继承Collection接口,核心实现类ArrayList(动态数组)、LinkedList(双向链表)、Vector(废弃线程安全类),各自针对不同场景优化。 核心实现对比: ArrayList:随机访问O(1),尾部操作高效,但中间增删需数组移位;JDK8懒加载+1.5倍扩容优化内存 LinkedList:首尾增删O(1),无扩容开销,但

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 356

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java基础面试208题精讲与核心知识点解析

Java作为主流编程语言,其基础概念的理解深度直接影响开发者的技术能力。数据类型、面向对象特性和异常处理构成Java三大基础模块,其中包装类缓存机制、接口默认方法等特性在工程实践中尤为重要。集合框架与多线程并发是面试高频考点,HashMap的红黑树优化、线程安全的单例模式实现等知识点能有效区分开发者水平。本套题库涵盖208道经典面试题,从基本语法到高级特性,帮助开发者系统构建Java知识体系,特别适合准备技术面试或希望夯实基础的Java工程师。

weixin_33785108的博客 617

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

集合框架 (六)

Java集合框架是存储和操作数据的核心工具,分为单列集合Collection和双列集合Map两大体系。Collection包括List(有序可重复)、Set(无序不重复)和Queue(队列);Map存储键值对,Key唯一。常用实现类有ArrayList、LinkedList、HashSet、HashMap等,各有特点:ArrayList基于动态数组查询快,LinkedList基于链表增删快,HashSet去重,HashMap键值映射高效。集合提供了丰富的API和遍历方式,支持泛型保证类型安全。开发中需注意线

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 239

【无标题】

Java 中普通集合类大多是线程不安全的,比如 ArrayList、HashMap 等,在多线程场景下需要额外处理。早期线程安全集合如 Vector、Hashtable 通过 synchronized 保证线程安全,但并发性能较差。JUC 包中提供了高性能线程安全集合,如 ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue,它们通过更细粒度锁、CAS 或读写分离来提高并发性能。

2302_81048526的博客 696
上一篇: 一次翻好多倍的SQL优化过程
下一篇: 还在用 System.currentTimeMillis() 统计代码耗时?(StopWatch监控Java代码运行时间)
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值