Java线程 CompletionService

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

CompletionService的使用

  当我们使用ExecutorService创建一个线程池时, 如果执行了多个Callable任务后, 每个Callable任务都会产生一个Future, 如果我们需要处理这些任务产生的结果, 那么就需要将这些Future放入一个线性表中, 用于之后的数据处理.

  有了CompletionService, 我们就不用人为地去创建线性表来存这些Future了, CompleService是一个更高级的EexcutorService, 它自身自带一个线程安全的线性表, 无需用户额外创建. 它提供了两个方法从线性表中取出结果:  poll()是非阻塞的, 若目前无结果, 则返回null, 当前线程继续运行不阻塞; take()是阻塞的, 若当前无结果, 则当前线程阻塞, 直到产生一个结果, 被取出返回, 当前线程继续运行.

代码如下:


import java.util.concurrent.*;

public class CompletionServiceTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(executorService);

        for (int i=0; i<5; i++) {
            completionService.submit(new Task());
        }
        executorService.shutdown();
        int count=0, index=1;
        while (count < 5) {
            Future<Integer> result = completionService.poll();
            if (result ==  null) {
                System.out.println(index + " 没有发现有完成的任务");
            }else {
                System.out.println(index + " 产生了一个随机数 " + result.get() );
                count++;
            }
            index++;
            TimeUnit.SECONDS.sleep(2);
        }
    }
}


import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

public class Task implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        Random random = new Random();
        TimeUnit.SECONDS.sleep(1);
        return random.nextInt();
    }
}

 运行结果如下:


1 没有发现有完成的任务
2 产生了一个随机数 1068729946
3 产生了一个随机数 -754072428
4 产生了一个随机数 -711120809
5 产生了一个随机数 -1696523068
6 产生了一个随机数 1409817456

Go语言集成Ollama本地大模型:gollama库实战指南 在当今的AI应用开发中,大型语言模型(LLM)的集成已成为关键技术。其核心原理是通过API调用,将自然语言处理能力嵌入到各类应用中。从技术价值看,本地化部署的LLM解决了数据隐私、网络延迟和持续成本三大痛点,尤其适合处理敏感数据或对实时性要求高的场景。在工程实践中,开发者常使用专门的客户端库来简化与模型服务的交互,例如通过封装REST API、提供类型安全接口和流式处理支持,从而提升开发效率和代码健壮性。具体到Go语言生态,结合Ollama这一流行的本地大模型运行工具,可以实现完全离线、低延迟的AI功能集成 阅读详情

相关推荐

CAN接受和发送失败的原因有哪些---之前调试MCP2515驱动时,数据一直发不出去,三个发送邮箱都被占满.至今未解决,读寄存器-总线错误

0.CAN总线错误分析与解决–讲的最精辟的放在最前面 我们知道CAN总线上的每个节点往总线上发送数据的同时会同时读取总线上的数据,并与自己发送的数据作对比。—CAN仲裁??? CAN总线错误分别有发送和接收错误计数,计数达到一定的累计以后就会产生CAN BUS OFF, 这说明CAN总线上出现了严重的错误。如下图CAN总线产生错误后的状态转换机制 如果出现了BUS OFF,总线上的节点需要做一些动作,例如重启CAN控制器或是重新上电,但是这些都只是一些补救措施,最根本的还是需要找到引起BUS OFF的根源

dianqicyuyan的博客 2万+

并发编程系列-CompleService 类

并发编程系列-CompleService 类 问题 使用 Future.get()异步获取结果的时候,当异步任务没有计算成功,主线程调用 get()方法获取结果的时候会一直阻塞到线程完成为止,影响运行效率。 我们习惯使用线程池达到线程的复用,线程池中使用 submit 异步计算任务获取返回结果的时候,我们可能 future.get()方式获取任务的返回结果,但是 N 个线程去执行,当前任务没有执行完成,而其他任务执行完事了,我们通过 future.get()方式获取结果的时候即使其他完事了,我们还需要等待

Eric_飞 340

STM32实战篇:使用USART发送/接收数据

在发送字符时也可以直接使用其对应的ASCLL码,例如: USART_SendData(USART1, 0x61);

qq_74114817的博客 596

Java并发——CompletionService

CompletionService 接口CompletionService的功能是以异步的方式生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理。使用submit执行任务,使用take取得已完成的任务,并按照完成这些任务的时间顺序处理它们的结果。 接口 Completion Service的结构比较简洁,仅有一个实现类 Executor Completion Service,该类的构造方法如图所示。 从构造方法的声明中可以发现,类 Executor Completion

吴声子夜歌的博客 967

手把手教你用mitmproxy抓包抖音数据流(附Python脚本模板)

本文详细介绍了如何使用mitmproxy抓包抖音数据流,包括环境搭建、证书安装和Python脚本模板。从mitmproxy配置到抖音API解析,提供完整的移动端数据流分析方案,帮助开发者快速掌握数据抓取技术,适用于应用优化、竞品分析和安全审计等场景。

weixin_33670786的博客 307

神经元细胞结构刨析(持续更新)

神经细胞的学习笔记

weixin_46596227的博客 2220

【Java多线程-4】CompletionService详解

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

云深不知处 4289

常见的数值积分方法 (欧拉、中值、龙格-库塔,【常用于IMU中】)

1. 积分基本概念 设F(x)为函数f(x)的一个原函数,我们把函数f(x)的所有原函数F(x)+C(C为任意常数)叫做函数f(x)的不定积分(indefiniteintegral)。 非线性微分方程: 在有限的时间间隔Δt积分: 连续时间内积分: 工程上最常见的有三种:欧拉积分(Euler method)、中值积分(Midpoint method)和龙格-库塔法积分(Runge–Kutta methods)。他们的区别就是如何用数值方法模拟一个斜率。这里简单总结如下: ...

努力努力努力 2万+

Java CompletionService 深度解析:原理、实现与实战

Java CompletionService 深度解析:原理、实现与实战

daweias的博客 864

2024年软考信息安全工程师备考历年真题汇总

信息安全工程师分属“信息系统”专业,位处中级资格,2016年下半年,第一次开考信息安全工程师(中级)考试。目前每年考试一次。已开考六次,2016年11月12日,2017年5月20日,2018年5月26日,2019年5月25日,2020年11月7日,2021年11月6日为第六次考试。 第五次和第六次考试,采用第二版教材。 2024年软考信息安全工程师备考历年真题汇总

月梦工作室 5101

RK3568平台(USB篇)USB基础知识

现象:把USB设备比如Android手机接到PC答1:是USB控制器,是USB控制器内嵌的root hub.答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone"提示你安装的是"设备驱动程序"。USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序。答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平USB设备的USB口内部,D-或D+接有1.5K的上拉电阻;

weixin_49303682的博客 1658

Java并发编程之CompletionService

简介:CompletionService功能是以异步的方式一边生成新任务,一边处理完成的任务,使得任务的执行与处理进行分离。使用submit提交任务,使用task获取已经完成的任务 先看个示例: 此功能是获取每个任务的执行结果,这里通过future来实现 public class FutureDemo { private static class CallableTask implements Callable<String> { private int time; pr

asoklove的专栏 913

【推荐100个unity插件】基于节点的程序化无限地图生成器 —— MapMagic 2

MapMagic 2是一款基于节点的程序化地形生成工具,可快速创建无限地图。主要功能包括:通过图形化节点编辑器构建地形逻辑;支持四个核心模块(对象、样条线、生物群落和笔刷);提供完整的操作指南,包括创建资产、使用编辑器窗口、节点操作等。工具具有直观的UI界面,支持节点连接、参数调整、图层管理等功能,并能实时生成地形。适合游戏开发者快速构建高质量的可玩地形环境。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3118

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

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

lichch的博客 2165

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java线程之CompletionService

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

华丽的痘痘 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java多线程获取结果CompletionService

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

FireAny2010的专栏 640

最新的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

java多线程中的CompletionService

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

allen的博客 766

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

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

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

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
上一篇: RunTime.getRunTime().addShutdownHook用法
下一篇: Quartz源码解析 ---- 触发器按时启动原理
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值