JUC之获取子线程的执行结果Future和Callable

JUC学习 - Executors框架详解1 接上一篇博客https://blog.youkuaiyun.com/qq_43605444/article/details/121569162?spm=1001.2014.3001.5501 7、Future、Callable接口 Future接口定义了操作异步任务执行的一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 Callable接口中定义了需要有返回的任务需要实现的方法。 @FunctionalInterface public interface Callable 阅读详情

Runable的缺点:没有返回值也不能抛出Checked Exception

Future的主要方法

get()
//get方法的行为取决于Callable任务的状态分五种情况

//1 任务正常完成,get立即返回结果

//2 任务尚未完成(未开始或进行中),get被阻塞直到任务完成

//3 任务被中断,get返回InterruptedException

//4 任务被取消,get返回CancellationException

//5 任务执行异常,get返回ExecutionException

get(long timeout, TimeUnit unit) //TimeoutException

//如果线程没有开始直接取消方法返回true.
//如果线程已完成或者已取消,返回false
//如果线程已经开始执行,那么将会根据参数是否中断执行的线程
boolean cancel(boolean mayInterruptIfRunning);

//是否完成,不管是否成功完成
boolean isDone();

线程池的submit方法返回Future

代码示例



/**
 * 描述:     演示批量提交任务时,用List来批量接收结果
 */
public class MultiFutures {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(20);
        ArrayList<Future> futures = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            Future<Integer> future = service.submit(new CallableTask());
            futures.add(future);
        }
        Thread.sleep(5000);
        for (int i = 0; i < 20; i++) {
            Future<Integer> future = futures.get(i);
            try {
                Integer integer = future.get();
                System.out.println(integer);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }

    static class CallableTask implements Callable<Integer> {

        @Override
        public Integer call() throws Exception {
            Thread.sleep(3000);
            return new Random().nextInt();
        }
    }
}

FuterTask获取Future

代码案例:



/**
 * 描述:     演示FutureTask的用法
 */
public class FutureTaskDemo {

    public static void main(String[] args) {
        Task task = new Task();
        FutureTask<Integer> integerFutureTask = new FutureTask<>(task);
//        new Thread(integerFutureTask).start();
        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(integerFutureTask);

        try {
            System.out.println("task运行结果:"+integerFutureTask.get());

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

class Task implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("子线程正在计算");
        Thread.sleep(3000);
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            sum += i;
        }
        return sum;
    }
}

 

基于阿里云物联网平台设计的实时图传系统_采用MQTT协议传输图像 当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。 在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,设备B负责接收设备A上传的数据然后解析显示出来。在阿里云服务器上需要配置云产品流转,让设备A的数据上传后自动发送给设备B。这样就完成了视频画面数据的流转。不过因为阿里云的最大数据限制,每次最大发送10240字节的数据。 阅读详情

相关推荐

在树莓派5(8G版)上运行Ollama + LLM

直接上结论,Ollama在树莓派上能安装,且本身运行起来毫无压力,但具体到大语言模型,Deepseek似乎不总是最佳选择。

ki1381的专栏 1651

Spring Boot 实现监控子线程的执行结果2种方法(Future.isDone()、事件监听器)

1 Maven依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--hutool工

旭东怪的博客 2706

小红书分享链接失效?教你永久保存笔记的2种方法(含API调用技巧)

本文详细解析了小红书笔记链接失效的原因,并提供了两种永久保存笔记的方法,包括短链接转换API调用技巧和本地归档技术。通过Python代码示例和工具推荐,帮助用户实现笔记内容的高效保存和管理,确保珍贵内容不再丢失。

gin88的博客 2768

Future - 获取子线程执行结果

1. 为什么要Future机制 对比常见的两种创建线程的方式,一种是直接继承Thread,另外一种就是实现Runnable接口,他们在执行完任务之后无法获取执行结果,从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果 Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。(因为可以异步获得执行结果,所以不用...

Javaer`s blog 1578

立创开源:基于STM32F103与ADS1256的六维力传感器低成本实现方案

本文详细介绍了一种基于STM32F103微控制器与ADS1256高精度ADC的低成本六维力传感器实现方案。该方案通过3D打印的六梁弹性体结构结合应变片,将多维力信号转换为电信号,并由24位ADC进行高精度采集。文章涵盖了硬件选型、电路设计、嵌入式软件驱动及上位机数据可视化全流程,为机器人、精密测量等领域的爱好者提供了一个可复现的开源实践参考。

weixin_34718952的博客 393

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 833

Future获取子线程的执行结果

1. Runnable的缺陷 2.Callable 接口 3. Future 类 4.用法1: 线程池的submit方法会回Future对象,6分da

法毅的博客 6124

Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

Projectsauron 的博客 7万+

Future/callable的作用,如何判断一个主线程的所有子线程全部执行结束

如果get这样阻塞调用 那和同步没有什么区别。。 这个方法有个作用,就是 一个进程启动多个线程的时候,如何判断所有的线程都结束呢? 可以每个线程都采用callAble,多个线程同时get 如果有一个获取不到,主线程就等待。.........

javaMylife的博客 1153

YOLO26改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

在目标检测领域,小目标检测一直是一个具有挑战性的问题。算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在中添加小目标检测层,以提高对小目标的检测能力。原始模型结构如下: 二、有效特征层对应的检测头类别 2.1 P3/8 - small检测头 原始模型中的对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。 适合检测尺寸大概在到像素左右的目标。 2.2 P4/16 - medium检测头 这个检测头对应的经过了更多的下采样操作,相比P3/

Limiiiing的博客 351

FAST-LIVO2 源码精读(十六):接入自定义传感器——多雷达适配与内外参标定

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏第十六篇。上一篇拆解了中每个关键参数的物理含义与调参路径,并反复强调外参RclPcl与时间偏移配错即全局失效;本篇承接这一悬念,回答更前置的工程问题——如何把 FAST-LIVO2 接到一套全新硬件上:新雷达如何通过的类型分支适配、相机内参与畸变模型如何配置、两组外参与时间偏移如何标定出来并填入 YAML,最后给出一份落地检查清单。

PX4-SLAM-PNC 199

JAVA并发编程工具篇--1.1理解Future获取线程执行结果

理解Future获取线程执行结果

拽着尾巴的鱼儿的博客 1648

2026.3.9:具身智能之GraspNet:Ubuntu24.04安装GraspNet

本文详细介绍了在Ubuntu24.04系统下安装GraspNet具身智能框架的全过程。主要包括:1) 创建Python3.9虚拟环境;2) 安装CUDA12.8和PyTorch2.7.0等基础依赖;3) 编译安装pointnet2、knn和graspnetAPI三个核心组件;4) 修改源码适配新版PyTorch;5) 下载预训练权重并成功运行demo。安装过程中特别提示了可能遇到的报错处理方案,最终在GPU环境下实现了GraspNet的部署运行。整个流程涵盖了从环境配置到项目运行的完整步骤,为具身智能研究者

拥抱具身智能,昇腾Ascend C 206

如何获取子线程的执行结果

前言 博主以前面试的时候,真真切切的被问过这样一道题: 如何获取子线程的执行结果? 总所周知,在单线程情况下,想获取线程执行结果很简单,只需要写类似的代码即可: Object result = xxx.getXxx(); 但是在多线程的情况下,想要获取子线程的执行结果,恐怕就没这么简单了。 剑走偏锋 我们都知道开启一个新线程的方式有两种:继承Thread类、实现Runnable接口。可是这两...

Sicimike的博客 5889

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

java计算所有子线程结果_如何获取子线程的执行结果

前言博主以前面试的时候,真真切切的被问过这样一道题:如何获取子线程的执行结果?总所周知,在单线程情况下,想获取线程执行结果很简单,只需要写类似的代码即可:Object result = xxx.getXxx();但是在多线程的情况下,想要获取子线程的执行结果,恐怕就没这么简单了。剑走偏锋我们都知道开启一个新线程的方式有两种:继承Thread类、实现Runnable接口。可是这两种方式都没有返回值,...

weixin_33232907的博客 557

老版QQ原生表情gif动态

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

JUC-02Future和Callable接口及改进的CompletableFuture

简介: Future接口定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 Callable接口中定义了需要有返回的任务需要实现的方法。 比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后, 主线程就去做其他事情了,过了一会才去获取子任务的执行结果。 FutureTask简介: package com.zzyy.study.test;...

天上地下的博客 316

Spring - JUC 理解Callable接口、Future接口

Callable接口:   Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解   优点:     可以获取线程的执行结果,也称为返回值     通过与Future的结合,可以实现利用Future来跟踪异步计算的结果 Runnable和Callable的区别:   Callable规定的方法是call(),Runnable规定的接口是run();   Callable的任务执行后可返回值,而Runnable的任务是不能有返回值的

迦南的专栏 412

【Beautiful JUC Part.11】Future和Callable治理线程

【Beautiful JUC Part.11】Future和Callable治理线程 一、为什么需要Future和Callable 1、Runnable的缺陷 线程没有返回值 run方法无法抛出checked Exception 这是因为run()方法在声明的时候就规定好了形式。只能通过try/catch捕获。 2、Callable接口 类似于Runnable,被其他线程执行的任务 实现ca...

weixin_45807596的博客 91

Java多线程进阶:JUC核心工具集详解

在前两篇笔记中,我们深入探讨了锁的底层策略以及 `synchronized` 的实现。从本篇笔记开始,我们将正式进入 `java.util.concurrent` (JUC) 工具集,去领略其提供的更强大、更灵活的并发工具。

weixin_73966418的博客 1036

【JUC并发 | 第七篇】简析Future 和 CompletableFuture类

Java异步编程中的Future和CompletableFuture:Future接口用于管理异步任务执行结果,提供取消、状态查询和结果获取功能。CompletableFuture作为增强实现,提供四大优势:1)简化异步任务创建执行;2)支持链式调用实现任务流水线;3)提供多任务组合编排能力;4)内置灵活异常处理机制。特别推荐生产环境使用自定义线程池,避免共享线程池的资源竞争问题。这些特性共同解决了传统异步编程中任务协调复杂、阻塞等待和异常处理繁琐等痛点,显著提升开发效率和系统性能。

h52412224的博客 1458

JUC(五)——Callable

创建线程的方式一共有四种 1、继承Thread类创建线程 2、实现Runnable接口创建线程 3、使用Callable和Future创建线程 4、使用线程池例如用Executor框架 前面两种大家肯定都了解,这里我们讲解第三种使用Callable和Future创建线程 Runnable接口和Callable接口的区别 //创建新类MyThread实现runnable接口 cl...

# Never Give up & 332

并发编程(九)Future、Callable、FutureTask、CompletableFuture、CompletionService

1.Future、Callable、FutureTask 1.1 如何获取线程执行的结果 Callable:与Runnable相似,只不过带返回值,并且执行call方法可能会抛出异常。 @FunctionalInterface public interface Callable<V> { V call() throws Exception; } Future:异步计算的结果,提供了一些方法来检验任务是否完成。两个 get() 方法都是阻塞式的。 // 取消任务 boolean can

weixin_42311088的博客 431

Java多线程的Callable, Future, FutureCallback, CompletableFuture

Callable可以看成是一个增强版的Runnable, 带返回结果, 需要通过Future或者FutureTask来提交任务或运行线程, 然后通过Future/FutureTask的get方法得到返回结果. Callable在子线程中运行, 在主线程中异步得到执行结果(get()方法是阻塞的), 或者检查是否已取消, 是否已完成(检查取消和完成的方法是非阻塞的) 通过Thread子线程启动 这...

IOsetting的专栏 621

005-多线程-JUC线程池-Future、FutureTask、CompletionService 、CompletableFuture

一、概述   创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。   详述...

dilv4062的博客 370

多线程JUC 第2季 Future接口与completablefuture接口异步

如果主线程需要执行一个耗时的计算任务,可以使用future把这个任务放到异步线程中执行。主线程继续处理其他任务或者先行结束,再通过future获取计算结果。future接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的复杂业务。特点:多线程,又返回值,异步任务。

健康平安的活着的专栏 523

Java JUC学习笔记

一、JUC简介 在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中的 Collection 实现等 JUC 简介 二、volatile Java中volatile关键字的最全总结 ...

Liuqz2009的专栏 290

Java 异步编程——异步处理并发任务的执行结果(CompletionService)

CompletionService 是 Java 并发包中的一个接口,用于简化异步任务的处理。它结合了 Executor 和 BlockingQueue 的特点,允许你在执行多个异步任务时,以更方便的方式获取它们的结果。异步任务优化 CompletionService,它是 JUC(java.util.concurrent)包中的一个接口类,默认实现类只有一个ExecutorCompletionService。

longool的博客 1019
上一篇: JUC之AQS的学习
下一篇: Redis学习(一)
yan_pengfei
博客等级 码龄8年 16粉丝 177原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值