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;
    }
}

 

【Docker】从零构建达梦DM8轻量级服务镜像:实战与优化 本文详细介绍了从零开始构建达梦DM8轻量级Docker镜像的完整实战流程。通过分析传统安装方式的痛点,阐述了使用Docker封装数据库的优势,并重点讲解了如何利用静默安装、精简组件、多阶段构建等优化技巧,打造一个体积小巧、启动迅速、配置灵活的DM8服务镜像,助力实现开发、测试与部署的环境一致性与高效性。 阅读详情

相关推荐

跟着团子学SAP CO:结果分析各评估方法计算逻辑概览 RA Valuation Method Overview KKA1/KKA2/KKA3

在大部分企业财务月结时,结果分析是必不可少的一环,通过结果分析系统可按照设定的评估方法及相关配置自动计算在制品(WIP)、主营业务成本、主营业务收入等等。 在结果分析中最重要的是根据业务需求选择合适的评估方法,目前SAP共提供15种评估方法,今天针对每一种方法计算逻辑及常用的业务场景进行介绍: (1)基于收入的评估方式(带利润实现) Revenue-Based Method with Profit Realization 第一种方式的计算是基于实际收入与计划收入的占比推算应结转的主营业务成本,如果当期累计的

Lucas1211的博客 1万+

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

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

旭东怪的博客 2706

计数译码驱动显示电路实验报告_京东方G0A电路、阵列基板、显示 装置及驱动方法广州威彩...

图1、实施例二所述的选择子单元的结构示意图图2、实施例四所述的GOA电路结构示意图图3、实施例七所述的阵列基板的局部结构示意图图4、实施例所述的极性反转驱动方法的第一场的各信号时序图图5、实施例所述的极性反转驱动方法的第二场的各信号时序图图6、实施例所述的极性反转驱动方法的第三场的各信号时序图图7、实施例所述的极性反转驱动方法的第四场的各信号时序图图8、为图4所示时序下,实施例八所述显示...

weixin_35696112的博客 925

Future - 获取子线程执行结果

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

Javaer`s blog 1578

ArcGIS图解建模工具与DEM提取山脊、山谷线(水文分析、表面分析)

参考汤国安、杨昕等编著的《地理信息系统空间分析实验教程第二版》 利用水文分析(流量)和表面分析(坡向变率)得到山脊和山谷线 文章目录1、基本概念1.1 正地形1.2 负地形正负地形的影响2、水文分析方法2.1 基本思想原理2.2 技术路线2.3 操作步骤2.3.1 正负地形的提取2.3.2 利用水文分析思想和工具提取研究区域的山脊线2.3.3 利用水文分析思想和工具提取研究区域的山谷线2.3.4 利用水文分析提取山脊线和山谷线结果3、表面分析方法3.1 基本思想原理3.2 技术路线3.3 操作步骤4、图.

fungis 1万+

Windows11下QGIS 3.34.4安装Geo-SAM插件全流程(附RTX3060 CUDA12.0配置技巧)

本文详细介绍了在Windows 11系统中为QGIS 3.34.4安装和配置Geo-SAM插件的完整流程,特别针对RTX 3060显卡用户提供了CUDA 12.0与PyTorch环境的精准搭建方案。通过预编码与交互式分割两大核心步骤,该插件能显著提升遥感图像半自动标注的效率,降低硬件门槛,是地理信息处理领域融合AI技术的实用指南。

weixin_29089057的博客 296

Future获取子线程的执行结果

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

法毅的博客 6124

关于“为爱发电”的一些说明~~

专栏教学资料+工程文件

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2675

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

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

javaMylife的博客 1153

手把手教你学PCIE(10.5)--PCIE故障排除方法的分步排查法介绍

通过以上分步排查法,你可以系统地诊断和解决 PCIe 设备的故障。每个步骤都有助于逐步缩小问题范围,最终找到并解决问题。

MHD0815的博客 1873

【数字IC验证进阶】正则表达式(Regular Expression)快速入门指南

在芯片开发过程中,正则表达式的使用非常常见。初次上手晦涩难懂,多用几次爱不释手!

悟已往之不谏 知来者之可追 1441

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

理解Future获取线程执行结果

拽着尾巴的鱼儿的博客 1648

网络安全与黑客攻防常见设备:前置机、跳板机、堡垒机与肉鸡

前置机、跳板机、堡垒机和肉鸡,这些看似冷僻的技术名词,实则是网络安全与黑客攻防战中的关键角色。它们有的守护着企业的数字Pltform,保卫网络安全;有的则成为黑客的跳板,游走于灰色地带。

网络技术联盟站 963

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

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

Sicimike的博客 5889

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

weixin_33232907的博客 557

蓝牙模块HM-10手册

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

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

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

天上地下的博客 316

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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
上一篇: 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、付费专栏及课程。

余额充值