有关采用parallelStream并行流处理List并使用自定义线程池和lettuce redis客户端一起使用的问题

Java脚手架生成的工程化革命:从代码补全到生产就绪 脚手架生成已超越传统代码补全,成为Java工程交付的核心能力。其本质是将Spring Boot、MyBatis-Plus、Redisson等框架的版本兼容性、依赖冲突治理、安全规范与可观测性配置等工程知识,转化为可执行的自动化流程。关键技术价值在于规避Jakarta EE迁移陷阱、实现多数据库适配、预防Lombok/Builder冲突等高频痛点,并支撑CI/CD直通、信通院认证、Fortify安全扫描等企业级交付标准。典型应用场景包括微服务快速搭建、遗留系统框架升级、高并发秒杀服务初始化等。本文聚焦2026 阅读详情

在使用parallelStream进行处理list时,如不指定线程池,默认的并行度采用cpu核数进行并行,这里采用ForJoinPool来指定线程池,但循环中使用了luttuce 来获取redis的key时,出现没有控制住线程池的线程数问题。具体上代码。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@Slf4j
public class ForkJoinPoolTest {
    @Resource
    RedisUtils redisUtils;
    @Test
    public void test() {
        ForkJoinPool forkJoinPool = new ForkJoinPool(2);
        List<Integer> fileList = new ArrayList<>();
        for (int i = 1; i < 100; i++) {
            fileList.add(i);
        }
        List<String> result = forkJoinPool.submit(() -> detail(fileList)).join();
    }
    public List<String> detail(List<Integer> fileList){
        return fileList.parallelStream().map(path-> {
            String ocrJson = (String) redisUtils.get("ocr:");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.info("第"+path+"张");
            return "第"+path+"张";
        }).collect(Collectors.toList());
    }
}

redisUtil的代码:

import org.springframework.data.redis.core.RedisTemplate;

@Component
@Slf4j
@SuppressWarnings({"unchecked", "all"})
public class RedisUtils {
    private RedisTemplate<Object, Object> redisTemplate;

    public RedisUtils(RedisTemplate<Object, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        this.redisTemplate = redisTemplate;
    }
    /**
     * 普通缓存获取
     *
     * @param key 键
     * @return 值
     */
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }
}

打印结果:

在这里我已经用ForkJoinPool forkJoinPool = new ForkJoinPool(2);来指定了parallelStream的线程数,但是这里并没有控制住,于是找原因定位到了redis获取key这行代码,将该代码注释后,就可控制parallelStream的并行度。上代码:

//String ocrJson = (String) redisUtils.get("ocr:");
String ocrJson = "";

这时控制台的打印就为:

在这里,redis 客户端采用的是lettuce,经排查可能是因为lettuce是异步客户端,而影响了parallelStream的并行度,具体是因为什么原因导致,待排查。

【信息科学与工程学】计算机科学与自动化——第八十一篇 Java分布式软件高并发/高可用算法01 4. 消息队列(如Kafka的Topic分区,本质是范围)。3. 若是ACCEPT事件,bossGroup线程接受连接,创建SocketChannel,并将其注册到workerGroup的一个EventLoop的Selector上,关注READ事件。1. 分布式缓存分片(如Redis Cluster)。4. 分布式文件存储(如Ceph CRUSH)。6. 调用栈的模拟(如协程)。3. 服务网格(如Istio)的基础。2. 本地缓存与集中式缓存(如Redis)的一致性维护。3. 静态数据(如配置)缓存。 阅读详情

相关推荐

Java8并行流中自定义线程池操作示例

主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧,需要的朋友可以参考下

聊聊如何自定义parallelStream的线程池

本文主要研究一下parallelStream怎么使用自定义的线程池。

go4it 2346

避开模板匹配的坑:OpenCVSharp中边缘梯度算法的优化实践

本文深入探讨了OpenCVSharp中边缘梯度算法在模板匹配中的优化实践,解决了传统方法在尺度变化、角度旋转和光照差异下的局限性。通过Sobel算子提取边缘梯度特征,结合轮廓检测和多尺度匹配策略,显著提升了匹配的鲁棒性和准确性。文章还分享了并行计算、内存访问优化等实战技巧,适用于工业检测和自动化识别场景。

http9protocoller的博客 198

JAVA-- 在Java8 Parallel Stream中如何自定义线程池?

使用Parallel Stream时,在适当的环境中,通过适当地使用并行度级别,可以在某些情况下获得性能提升。 如果程序创建一个自定义ThreadPool,必须记住调用它的shutdown()方法来避免内存泄漏。 本文通过实际代码示例,让你快速理解如何自定义线程池

penriver的博客 8808

EB tresos配置指南:CAN通信信号收发全流程解析

本文详细解析了使用EB tresos配置工具实现AUTOSAR架构下CAN通信信号收发功能的全流程。从环境准备、COM模块信号定义、PduR路由配置、CanIf硬件抽象到CAN驱动层设置,提供了清晰的步骤指南和关键配置要点,帮助开发者快速打通从应用层到物理层的数据链路,实现可靠的CAN通信。

weixin_29192141的博客 509

数据分析项目:直播电商用户流失分析

其中,'Tenure'(在网时长)可能是影响用户流失的关键因素,意味着用户在平台上的停留时间越长,流失的可能性可能越低,这提示平台应注重提高用户粘性,增加用户在平台上的活跃度和停留时间。)的分析,挖掘用户流失的原因和模式,分析发现用户投诉处理效率(Complain)、距上次消费时长(DaySinceLastOrder)、会员生命周期(Tenure)等8项核心指标对流失预测贡献度达87%,模型准确率94.58%,并提出相应的建议。重视用户的满意度,及时处理用户的投诉和反馈,不断改进平台的服务和功能。

Nervousr的博客 2459

list中parallelStream流慎用

list流常用

qq_37342720的博客 3648

Eureka常见面试题总结

点击关注我的博客原文 Eureka是Netflix组件的一个子模块,也是核心模块之一。云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移(来源springcloud中文网的介绍:https://www.springcloud.cc/)。下图总结了Eureka服务端(以下简称服务端)与Eureka客户端(以下简称客户端)之间协同工作的流程: 流程说明:...

u012105931的博客 2万+

Java List parallelStream并行流

Java中List的parallelStream线程流技术,可以很方便的帮我实现多线程,下面结合一个案例来看看效率的优化使用MyBatis框架向MySQL写入100000条数据,对比使用parallelStream和没有使用parallelStream小路的区别 耗时157s 耗时100s 总结 使用parallelStream会比没有使用parallelStream的速度更快...........................

鸟人的博客 3244

STM32 cubeMX配置串口重定向

这篇文章主要讲解什么是串口重定向,为什么要串口串口重定向。使用printf函数和上位机通信是非常的方便的。希望大家都能够掌握。

m0_49476241的博客 4573

使用OpenGL加载和显示DXF格式的3D模型文件编程

这样,我们就完成了使用OpenGL加载和显示DXF格式的3D模型文件的编程。通过实现加载函数和绘制回调函数,我们能够读取DXF文件的数据并使用OpenGL绘制出来。请注意,这只是一个简单的例子,仅涵盖了基本的加载和显示功能。在本文中,我们将探讨如何使用OpenGL编程加载和显示DXF(Drawing Exchange Format)格式的3D模型文件。DXF是一种通用的CAD(计算机辅助设计)文件格式,常用于存储和交换2D和3D图形数据。使用OpenGL加载和显示DXF格式的3D模型文件编程。

2301_79331421的博客 413

Claude Code深度解析:代码语义理解与工程级AI协作者实践

AI编程工具正从语法补全迈向代码语义理解——这一范式升级要求模型具备AST解析、上下文建模与工程约束识别能力。基于抽象语法树(AST)的语义分析,使AI能区分`list.isEmpty()`与`list.size() == 0`的业务等价性;128K上下文支持则真实适配微服务链路调试等复杂工程场景。其技术价值在于将AI定位为‘人主导、AI协作者’,强调渐进式生成、安全边界意识与设计决策前置,而非黑盒输出。典型应用场景包括遗留系统重构、多模块联调诊断、Spring生态安全重构及跨语言API契约同步。本文聚焦C

weixin_30338481的博客 419

Python 爬虫实战:爬虫代码打包为可执行文件

本文详细介绍了使用PyInstaller工具将Python爬虫打包为可执行文件的全过程。以豆瓣电影Top250爬虫为例,首先对比了主流打包工具,推荐选择跨平台的PyInstaller。通过编写完整的爬虫代码(包含异常处理和数据保存功能),演示了从环境准备、代码测试到打包配置的具体步骤。重点讲解了单文件打包、自定义图标等高级功能,并针对常见的"找不到模块"、文件体积过大等问题提供了解决方案。文章还说明了跨平台打包的注意事项,帮助开发者实现爬虫程序的无环境依赖部署,大幅提升程序的易用性和部署

2503_91057718的博客 2216

parallelStream并发流的线程知识,以及自定义线程方法

parallelStream并发流的线程知识,以及自定义线程方法

weixin_59244784的博客 3401

在 SAP 世界里拥抱非 SAP 技术:一名 ABAP 开发者的成长路径与实战方法论

那段时间非常煎熬,但它带来的回报也很真实:你会更尊重“可观测性”的价值,也会更愿意在 SAP 场景里把日志、追踪、断言、隔离测试做扎实。解决这类问题,靠的并不是某个神奇的 SAP 函数,而是跨栈的工程设计:接口要有业务幂等键,SAP 侧要有落库与锁策略,返回要有可识别的状态码,异常要能回放,补偿要有可追踪的工单或队列。这套体系吸引我的地方,在于它更贴近真实业务:客户要的往往不是“能打印”,而是“能规范地输出”,包括版式、字体、条码、二维码、电子签章位置、分页规则、多语言、合规水印、可回写的交互字段等。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 168

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java8 并行流(parallelStream)原理分析及注意事项

众所周知,Java 使用Stream流做多线程处理是非常方便的。随着并行编程越来越流行,Java从1.7就开始提供了Fork/Join 支持并行处理,并且在1.8版本进一步加强了相关功能。并行处理就是将任务拆分子任务,分发给多个处理器同时处理之后进行合并。本文将会对并行流(parallelStream)原理分析及注意事项进行详细介绍。

Clearlove_S7的博客 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Jdk8 ParallelStream(并行流),自定义线程池,性能测试,okhttps同步及异步请求,干货,真实开发技术选型。

jdk8并行流,自定义线程池,性能测试,okhttps同步及异步请求

CJ_L1995的博客 2390

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java 8中的parallelStream()方法:并行处理数据集合->加快List循环速度

但需要注意的是,并非所有情况下都适合使用并行处理,因为并行处理会带来一些额外的开销,例如线程调度和数据拆分。引言: 在Java 8中,引入了许多新的特性和API,其中一个重要的特性是Stream API。接口提供的一个方法,它返回一个并行流。是Stream API中的一个强大的功能,它使得我们可以轻松地将数据集合并行处理,从而充分利用多核处理器的优势,提高处理性能。由于并行处理,输出的结果可能会是乱序的,这是因为不同线程的执行顺序是不确定的。在上面的示例中,我们创建了一个包含100万个整数的列表,并使用。

weixin_46432232的博客 3028

多线程之自定义线程池

1 自义定线程池1定义2 组成部分自定义线程池组成部分: 核心线程数,等待超时时间,等待时间单位,任务队列,拒绝策略.

ABestRookie的博客 864

多线程之parallelStream

parallelStream默认使用线程池ForkJoinPool来调度的,而ForkJoinPool的默认线程数是CPU核数 - 1。总结:在使用parallelStream时要注意根据需求选择合适的线程池,避免出现线程池溢出等一系列问题。输出:使用spring框架中的 ForkJoinPool.commonPool。输出:使用的依旧是 ForkJoinPool.commonPool。举例二:使用其他线程池,如 Executors.输出:使用自定的ForkJoinPool线程池。

m0_57801749的博客 1728

List集合操作

查询两个List的差集 /** * 差集 * 求List1中有的但是List2中没有的元素 */ public static List<String> subList(List<String> list1, List<String> list2) { Map<String, String> tempMap = list2.parallelStream().collect(Collectors.toMap(Function.identity()

qq_37634156的博客 1616

java parallelStream接口配置线程池数量

【代码】java parallelStream接口配置线程池数量。

路过君的博客 3683

Java8 并行流(parallelStream)原理分析及线程池线数设置

我们都知道在java 使用strem流做多线程处理是非常方便的。 list.parallelStream().forEach(s -> { // 业务处理 }); 但是parallelStream是如何实现多线程处理的呢?其实看源码我们会发现parallelStream是使用线程池ForkJoin来调度的,这里我们可以看源码看到 由于我们使用的 forEach,所以直接看类ForEachOps即可.当然其他方法比如reduce等会有不同的实现类,总的实现类是如

念念不忘,必有回响 2万+

list.parallelStream().foreach()并发问题

需求描述 数据同步:联合查询数据库A的两张表,得到新数据,然后入库数据库B的一张表。由于数据量可能较大(在定时任务下不会太大,但手动拉取可能会有几十万的数据),采用线程池来查询与插入(修改)。 问题描述 在查到新数据后,需要将其分为两部分:一部分是新增,一部分是修改。为了效率,前人采用parallelStream并发流来遍历数据,结果导致ArrayIndexOutOfBoundsException数组越界异常。 原因分析 ArrayIndexOutOfBoundsException异常说明是存放数据的lis

weixin_50604409的博客 4698

Java8遍历list stream和parallelStream的区别

进行流式处理,但它们在执行方式上有明显区别。在 Java 8 中,

longgelaile的博客 832

针对java中list.parallelStream()的多线程数据安全问题我们采用什么方法最好呢?

针对java中list.parallelStream()的多线程数据安全问题我们采用什么方法最好呢?

gb4215287的博客 2139
上一篇: shiro 采用redis共享session,出现反序列化错误的排查过程
下一篇: 有关用easyExcel批量导入excel入库慢的调优记录
nightseventhunit
博客等级 码龄16年 27粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值