Java线程之CompletionService

ExecutorCompletionService结果没调用take,poll方法导致的生产事故 阅读详情

当使用ExecutorService启动了多个Callable后,每个Callable会产生一个Future,我们需要将多个Future存入一个线性表,用于之后处理数据。当然,还有更复杂的情况,有5个生产者线程,每个生产者线程都会创建任务,所有任务的Future都存放到同一个线性表中。另有一个消费者线程,从线性表中取出Future进行处理。

CompletionService正是为此而存在,它是一个更高级的ExecutorService,它本身自带一个线程安全的线性表,无需用户额外创建。它提供了2种方法从线性表中取出结果,poll()是非阻塞的,若目前无结果,返回一个null,线程继续运行不阻塞。take()是阻塞的,若当前无结果,则线程阻塞,直到产生一个结果,被取出返回,线程才继续运行。

public class Test {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ExecutorService executor = Executors.newCachedThreadPool();
		CompletionService<Integer> comp = new ExecutorCompletionService<>(executor);
		for(int i = 0; i<5; i++) {
			comp.submit(new Task());
		}
		executor.shutdown();
		int count = 0, index = 1;
		while(count<5) {
			Future<Integer> f = comp.poll();
			if(f == null) {
				System.out.println(index + " 没发现有完成的任务");
			}else {
				System.out.println(index + "产生了一个随机数: " + f.get());
				count++;
			}
			index++;
			TimeUnit.MILLISECONDS.sleep(500);
		}
	}
}

class Task implements Callable<Integer> {

	@Override
	public Integer call() throws Exception {
		Random rand = new Random();
		TimeUnit.SECONDS.sleep(rand.nextInt(7));
		return rand.nextInt();
	}
	
}


【Java多线程】JUC之线程池(五) CompletionService 、CompletableFuture - 异步编程是编写`非阻塞的代码`,运行的任务`在一个单独的线程`,与`主线程隔离`,并且会`通知主线程它的进度`,`成功或者失败`。在这种方式中,`主线程不会被阻塞`,不需要一直等到子线程完成。`主线程可以并行的执行其他任务。`使用这种并行方式,可以极大的提高程序的性能。 阅读详情

相关推荐

E5071C 网络分析仪使用指南

E5071C 网络分析仪是 Keysight(原 Agilent)推出的一款高性能矢量网络分析仪,广泛应用于射频(RF)和微波(MW)电路设计、天线测试、滤波器优化等领域。它以高精度、宽频率范围(9 kHz–20 GHz)、出色的动态范围和灵活的测量功能著称。本文将详细介绍 E5071C 的基本操作方法,帮助用户快速上手并高效使用该设备。

2501_90901792的博客 4185

Java并发编程(五)CompletionService

java.util.concurrent.CompletionService 是对 ExecutorService 的一个功能增强封装,优化了获取异步操作结果的接口。pool() 方法可以用来获取并移除表示下一个以完成任务的Future 如果不存在则返回null 并且不会阻塞。也可以在指定的时间内等待,超时后继续向下运行。CompletionService 主要用来解决FutureTask阻塞的问题,可以更加高效的处理Future的返回 获取最先执行玩的任务的返回值进行处理。

m0_43582028的博客 512

建议收藏:华为海思IC设计笔试题,含解析(附下载)

接触过的部门有麒麟芯片、CPU/GPU,总体面试感觉非常好,规范且认真,第一轮手撕代码状态机+复盘机考题+瞄准几个知识点深挖,时间1hour+;一二轮面试是连着的,所以很累。但是岗位就那么多,在面试的时候,很多同学因为准备不充分,与岗位失之交臂,无缘进入该公司。时序电路有记忆功能,不会产生锁存器,锁存器一般在组合逻辑中case写不全,else写不全,或者敏感列表写不全。

nuoweishizi的博客 3286

Java高并发编程中CompletionService的使用及详细介绍

Java高并发编程中CompletionService的使用及详细介绍-刘宇 一、什么是CompletionService? 二、ExecutorCompletionService中的方法 1、构造方法 2、submit方法 3、take方法 4、poll方法 三、案例 1、问题复现 2、利用CompletionService解决问题 作者:刘宇 优快云博客地址:https://blog.csdn.net/liuyu973971883 有部分资料参考,如有侵权,请联系删除。如有不正确的地方,烦请指正,谢谢

很多时候犯错都是在不知情的情况下发生的 759

SPL06气压温度传感器SPI驱动与补偿算法详解

气压传感器与温度传感器是嵌入式环境感知系统的核心组件,其测量精度高度依赖于MEMS芯片的校准参数与非线性补偿机制。SPL06作为集成式高精度数字传感器,采用24位Σ-Δ ADC与片内补偿引擎,需结合唯一出厂校准系数(即‘芯片指纹’)进行多阶数学修正,才能将原始ADC值转化为符合计量要求的帕斯卡(Pa)与摄氏度(℃)物理量。该过程涵盖SPI通信协议解析、寄存器时序控制、大端数据拼接、二进制补码处理及浮点/定点混合运算等典型嵌入式工程实践。广泛应用于无人机高度计、智能穿戴海拔监测与IoT气象终端中。

weixin_34640289的博客 142

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

使用CompletionService批处理任务(线程池阻塞线程)

如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果。为此你可以保存与每个任务相关联的Future,然后不断地调用timeout为零的get,来检验Future是否完成。这样做固然可以,但却相当乏味。幸运的是,还有一个更好的方法:完成服务(Completion service)。 CompletionService整合了Executor和BlockingQueue的功能。...

正走向大牛的菜鸟 847

HWSD中国土壤数据库

T_PH_H2O: Real (酸碱度) T_CEC_CLAY: Real (粘性层土壤的阳离子交换能力);T_CEC_SOIL: Real (土壤的阳离子交换能力) T_BS: Real (基本饱和度);T_CACO3: Real (碳酸盐或石灰含量) T_CASO4: Real (硫酸盐含量);ADD_PROP: Real (土壤单元中与农业用途有关的特定土壤类型);T_USDA_TEX: Real (USDA土壤质地分类);T_REF_BULK: Real (土壤容重);

地球资源数据云的官方博客 4651

CompletionService的基本使用以及原理

CompletionService是Java并发编程中的一个工具类,它实现了一个任务完成的队列,并且可以按照任务完成的顺序来获取任务的结果。CompletionService的主要作用是提供一种方式来处理一批并发执行的任务,并且在它们完成后按照完成的顺序获取结果。它通常与ExecutorService一起使用。使用CompletionService可以将一组任务提交给ExecutorService去执行,并且通过调用CompletionService的take()方法来获取已经完成的任务的结果。

qq_39939541的博客 2468

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

YOLO11优化:特征融合 | 金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块 | 25年7月最新成果

我们提出金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块,通过由粗到细的 token 选择机制和共享注意力参数,在大幅降低计算量的同时保留空间细节。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1062

java高并发之CompletionService优化多线程并发

1:还是上个需求 工作流策略的一个节点,需要查询13个第三方的数据,并返回查询结果变量,由于时间的要求,必须实现并行查询,而且要求13个查询全部完成才能返回工作流节点。 没看过上个帖子的可以看看 java高并发之有返回值的多线程并发 上一个帖子的实现是 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了

lichch的博客 2165

【HALCON 25.11 + C#】 01:2026年工业机器视觉实战详解(从入门到精通)

2026年机器视觉市场规模将突破230亿美元,HALCON 25.11的革命性更新与C#的工业集成优势形成黄金技术栈。本文作为付费专栏开篇序章,聚焦“为什么现在必须学25.11+C#”的核心问题,通过真实工业案例、五项核心技术突破、联合编程架构优势及30篇系统学习路线,全方位论证其投资价值。读者将掌握持续学习、深度OCR加速等关键技能,获得可直接上产线的工业级代码资产与架构设计思维,解决柔性生产、边缘部署等核心痛点,成为具备技术溢价的机器视觉工程师。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1217

【Java多线程-4】CompletionService详解

CompletionService是一个接口,该接口只有一个实现类 ExecutorCompletionService,该类使用创建时提供的 Executor 对象(通常是线程池)来执行任务,然后将结果放入一个阻塞队列中。 // Linkedblockingqueue作为任务完成队列 ExecutorCompletionService(Executor executor) // 将所提...

云深不知处 4290

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java take和poll,Java多线程-CompletionService

起在之前说过,线程池ThreadPoolExecutor可以调用submit方法来获取返回值Future。像下面这样:这里先定义三个Callable,之后都用这三个:Callable callable1 = new Callable() {@Overridepublic String call() throws Exception {Thread.sleep(5000);return "我是cal...

weixin_42128988的博客 1614

计算机控制技术及应用

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

java多线程中的CompletionService

在java编程的时候,可能我们会经常遇到多线程的处理问题有些时候只需要创建子线程让其执行一些逻辑,但是不需要返回数据,那就可以用Thread或者Runnable来实现就行而有些时候需要创建多个子线程去执行逻辑,并且执行完成后需要拿到返回数据,就可以使用Callable当我们使用线程池去提交Callable线程任务就可以拿到线程执行的应用Future对象,如果不使用CompletionService

allen的博客 766

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

2021版Java线程池教程17:如何使用 CompletionService?

2021版Java线程池教程17:如何使用 CompletionService?介绍 CompletionService、ExecutorCompletionService 的作用及用法。 线程池17:如何使用 CompletionService? 视频全集 2021版Java线程池教程 2021版Java多线程教程 代码 Github地址【全部代码】 Task.cl.

人人都是程序员官方博客 322

java多线程获取结果CompletionService

java多线程异步获取结果CompletionService 一、前言: 在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java并发包提供的CompletionService 方法可以帮我们解决。 二、定义: 下面我们来看一下这个CompletionService...

FireAny2010的专栏 640

Java线程池ExecutorService与CompletionService     所属分类 java

首页快速返回 Java线程池ExecutorService与CompletionService 所属分类java 并行执行任务并获取返回结果 CompletionService 执行快的先返回 ExecutorService 例子 public class FutureTest { private static ExecutorService pool = Ex...

qq_41665476的博客 270

【Java线程池高级技巧】:利用Future与CompletionService实现精准完成回调

掌握ThreadPoolExecutor的完成回调实现技巧,解决任务执行结果的精准回调问题。通过Future与CompletionService监控线程池任务完成状态,适用于高并发异步处理场景,提升响应效率与资源利用率,代码简洁可控,值得收藏。

FuncTide的博客 685

[Java线程池]ExecutorService|CompletionService的区别与选择

这段时间对业务系统做了个性能测试,其中使用了较多线程池的技术,故此做一个技术总结。 这次总结的内容比较多,主要是四个: ExecutorService CompletionService Runnable Callable 前两个是线程池相关接口,后两个是多线程相关接口。在最后,我会说明什么情况下使用哪个接口,这两类接口如何搭配使用。 Tips:个人拙见,如有不对,请多多指正。 一、ExecutorService ExecutorService是一个接口,继承自Executor。ExecutorSe

NBA首席形象大使坤坤 1567

java多线程之CompletionService代码示例

java多线程之CompletionService代码示例

我的博客 320

Java 多线程中关于 ExecutorService 和 CompletionService的讨论

我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用。 之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象。 在主线程中遍历这个list并调用Future的get()方法取到Task的返回值。

大树叶 技术专栏 516
上一篇: Java线程之FutureTask
下一篇: Java线程之fork/join框架
andycpp
博客等级 码龄22年 698粉丝 72原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值