JAVA多线程进阶篇 10、JUC之Callable Future FutureTask

【Java多线程】JUC之线程池(三) Future、FutureTask 描述 Future FutureTask CompletionService CompletableFuture 原理 Future接口 接口RunnableFuture的唯一实现类,RunnableFuture接口继承自Future+Runnable 内部通过阻塞队列+FutureTask接口 JDK8实现了Future, CompletionStage两个接口 多任务并发执行 支持 支持 支持 支持 获取任务结果的顺序 按照提交顺序获取结果 未知 支持任务完成的先后顺序 支持任务完成的先后顺序 异常捕捉 阅读详情

了解线程池之前需要对线程定义的方法进一步补充,可以参见《JAVA多线程基础篇 2、如何创建线程》

1. Callable

在JDK5之后,增加了Callable接口,实现该接口的类,可以类似Runnable方法,在多线程环境中运行,并且返回运行结果。

public class CallableA implements Callable<String>{

    @Override
    public String call() throws Exception {
        //模拟耗时计算
        Thread.sleep(1000);
        return "您好 ! 蛋糕做好了";
    }
}

2. Future与线程池配合运行

调用Callable对象,需要配合Future和线程池。
线程池提交Callable任务后,会返回Future对象.此时Future对象只是一个占位符,就好像去订蛋糕,蛋糕店会给你一张提货小票。
当调用future.get()方法时,才会阻塞直到获取结果。

    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> future = executorService.submit(new CallableA());
        System.out.println(future.get());
        executorService.shutdown();
    }

运行结果:

您好 ! 蛋糕做好了

3. FutureTask

FutureTask非常灵活。它同时实现了Runnable接口和Callable接口,,还实现了Future接口。所以FutureTask既能当做一个Runnable直接被Thread执行,也能作为Future用来得到Callable的计算结果。

3.1 FutureTask作为线程单独运行

public class FutureTaskTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        Callable<String> makecake = new Callable<String>(){
            @Override
            public String call() throws Exception {
                return "蛋糕做好了";
            }
        };

        FutureTask<String> task = new FutureTask(makecake);

        new Thread(task).start();

        System.out.println(task.get());

    }
}

运行结果:

您好 ! 蛋糕做好了

3.2 FutureTask与线程池配合运行

也可以将FutureTask提交到线程池运行,然后从FutureTask里取出Future结果。
因为FutureTask即实现了Runnable接口和Callable,还实现了Future接口。


public class FutureTaskTest2 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        Callable<String> makecake = new Callable<String>(){
            @Override
            public String call() throws Exception {
                return "蛋糕做好了";
            }
        };

        FutureTask<String> task = new FutureTask(makecake);

        ExecutorService executorService = Executors.newCachedThreadPool();

        executorService.submit(task);

        System.out.println(task.get());
    }
}

运行结果:

您好 ! 蛋糕做好了

总结

除了Runnable接口外,Callable结合线程池、以及FutureTask类都可以提交线程任务。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略 本文深入解析IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略,涵盖其核心特性、硬件电阻调节技巧、I2C动态控制方案、散热设计优化及典型问题排查。IP2315支持多种快充协议,如Type-C PD、华为FCP等,适用于便携设备快速充电需求,并通过I2C实现灵活的充电参数设置,提升充电效率与安全性。 阅读详情

相关推荐

基于gm/id方法的折叠式共源共栅放大器设计实践

本文详细介绍了基于gm/id设计方法进行折叠式共源共栅放大器设计的完整流程。该方法通过确定晶体管的跨导效率(gm/id)作为核心设计参数,将复杂的放大器设计转化为有明确路径的优化问题。文章以设计一个增益80dB、带宽1GHz的两级放大器为例,逐步拆解了从指标分解、关键晶体管工作点选取、到实战仿真与微调的全过程,特别强调了第二级设计对稳定性的影响以及相位裕度的调试技巧。

w8x9y0z1的博客 415

JUC-CompletableFutureNetMallDemo

模拟电商网站的比价需求 package com.example.thymeleaf.controller; import java.util.Arrays; import java.util.List; import java.util.concurrent.*; import java.util.stream.Collectors; /** * @author jl * @since 2021/9/25 18:32 */ public class CompletableFutureNetMa

江黎 273

项目经理面试 5 大高频题 + 实战回答模板,帮你稳拿 offer

项目经理面试5大高频问题及应答技巧 摘要:本文总结了项目经理岗位常见的5个面试问题及回答策略,帮助求职者更有针对性地准备面试。核心问题包括:1)描述负责过的典型项目;2)常用项目管理工具;3)项目遇到的挑战及解决方案;4)风险管理方法;5)项目成功标准。每个问题都从面试官考察重点、回答技巧、实战案例三个维度进行分析,强调要用STAR法则(情境-任务-行动-结果)结构化表达,突出解决问题的能力而非简单罗列经历。特别提醒要量化项目成果(如提前2周上线、节省8%预算等),并注意展示商业思维和团队协作能力。

逸尘谈PM 2105

【JUC基础】15. Future模式

Future 模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。当我们需要调用一个函数方法时,如果这个函数执行得很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调者立即返回,让它在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获得需要的数据。

有一只柴犬的专栏 1132

GD32官方资料学习体系(主要包括MCU选型、原理图PCB设计、软件开发入门及用户手册等)

大部分还未更新,先占个坑,日后更新…… 目前国外芯片涨价涨的离谱(就是在说ST),国内最好的替代就是兆易创新出的系列芯片了。但是官方资料繁杂,小白上手不易,因此边入门边记录,也给后来者根据官方资料可以有一个较为完整的学习体系。

Eddie的博客 1万+

OAI数据集申请与实战:从权限获取到医学影像分析应用

本文详细介绍了OAI数据集的申请流程与医学影像分析实战应用。从NDA账户注册、数据下载技巧到骨盆X光关键点检测的完整实现,帮助医学研究者高效利用这一权威骨关节炎数据集。特别分享使用Pei Y标注数据训练U-Net模型的经验,包括预处理、注意力机制优化等实用技巧。

weixin_30275415的博客 479

JUC基础(二)—— Future接口 及其实现

前面我们讲了JUC里面线程池的相关内容,我们在代码中把任务交给线程池,实际上就是一种线程异步的操作,这能提升性能减少接口相应时间。但是大部分情况下,我们还会在适当的时间后,看看任务有没有完成,又或者从异步线程里取回结果来进行后续操作,那么就用到了本期的内容了。

战斧的博客 661

一条龙开发指南:MCP AI Agent 理论+项目实战开发你的MCP Server

MCP(Model Connection Protocol)是Anthropic于2024年推出的AI模型连接协议,旨在为AI模型提供开放、通用的标准化接口,类似于“USB-C”接口,使AI模型能够无缝连接各种数据源和工具。MCP通过标准化协议解决了AI系统集成中的碎片化问题,提升了开发效率和系统可靠性。开发者可以通过简单的配置,快速接入不同的MCP Server,实现AI模型的多样化应用。MCP支持多种协议,如Stdio、SSE等,并通过JSON-RPC格式进行数据传输。文章还以腾讯云代码助手为例,展示了

杨不易呀 3046

【JUC系列】Future异步回调模式

何为异步回调 前面只是一个例子,对并发的主要模式进行形象的说明。 下面正式来讲下经常使用的几个和并发相关的概念。 1.2.1. 同步、异步、阻塞、非阻塞 一:同步 所谓同步,就是在发出一个功能调用时,在没有获得结果以前,该调用就不返回。也就是必须一件一件事作,等前一件作完了才能作下一件事。 单线程模式,就是绝对同步的。 二: 异步 异步首先必须是多线程模式。是指当前线程,向其余的异步线程发出调用指令。当前线程和异步线程,逻辑上同时执行。 三:阻塞 在异步的场景下,当前线程阻塞住,等待异步

qq_35789269的博客 1260

30天Python入门(第一天:Python入门)

30天带你入门Python,这是第一天

Science prince的博客 584

【银河麒麟桌面系统】自定义ISO镜像操作实践

本文详细介绍了麒麟操作系统Kylin-Desktop-V10-SP1的ISO镜像定制流程。通过挂载原始镜像、解压文件系统、进入chroot环境进行系统定制(包括文件替换和软件管理),最终重构squashfs并生成新ISO。关键步骤包括:挂载镜像到mnt目录、解压filesystem.squashfs、替换源配置文件、在chroot环境中清理系统、重新生成squashfs文件以及使用mkisofs命令创建新镜像。文章特别标注了x86和ARM架构的不同命令参数,并提供了安装测试验证方法。整个过程展示了从原始镜像

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2342

Java——聊聊JUC中的Future和FutureTask

Java——聊聊JUC中的Future和FutureTask

贝尔摩德苦艾酒 4927

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

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

JUC之Callable接口,Future接口

Java多线程-Callable的Future返回值的使用 一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中: public interface Executor {   void execute(Runnable command); } 这个方法是没有返回值的,而且只接受Runnable。 那么像得到线程的返回值怎嘛办呢? 在ExecutorService接口中能找到这个方法: <T> Future<T> submit(.

liuerchong的博客 711

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JUC系列(六) | Callable和Future接口详解&使用、FutureTask应用 获取异步线程返回值

多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样的。 一、Callable 接口???? 1)前言: 在上上篇文章中,创建线程那个小角落,提到了这个,但是当时只是匆匆忙忙讲了一下。到这里再全面性的讲解一下。 我们以前使用实现Runnable接口的方式来创建线程,但是Runnable的run() 存在一个缺陷问题,就是不能将执行完的结果返回。 Java就是为

北 605

OV9734 DATASHEET,完整规格书

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

Java基础学习总结:多线程之(五)Callable、Future、FutureTask

主要介绍了Callable接口、Future接口和FutureTask类,以及这些接口和类的简单使用。

Vaingloryss的博客 279

别再问我Runnable、Callable、Future、FutureTask有什么关联了

Runnable与Callable 众所周知,当我们使用线程来运行Runnable任务时,是不支持获取返回值的,因为Runnable接口的run()方法使用void修饰的,方法不支持返回值。而在很多场景下,我们一方面需要通过线程来异步执行任务,以便提升性能,另一方面还期望能获取到任务的执行结果。尤其是在RPC框架中,异步获取任务返回值,几乎是每一个RPC接口要实现的功能。这个时候,使用Runnable显然就无法满足我们的需求了,因此Callable就出现了。 Callable与Runnable类似,它是一个

stay hungry,stay foolish! 438

JUC框架 从Runnable到Callable到FutureTask 使用浅析

本文旨在简单讲解Runnable、Callable、FutureTask这几个线程执行相关的接口和类。为后面FutureTask源码讲解作铺垫。

anlian523的博客 759

juc基础(二)

集合在线程中的不安全问题解决方案,多线程锁,Callable和Future接口,JUC三大辅助类

m0_62946761的博客 2938

JAVA多线程之——Future与Callable

Futrue与Callable在学习了多线程之后,可以知道线程的实现方式是通过继承Thread或者实现Runnable接口,当线程被启动后,会执行run方法。都知道run方法是一个void方法,也就是说线程执行完毕之后,不会返回任何东西。那么,如果我们想得到线程执行的结果怎么呢?这就要用到JUC中的Futrue与Callable了。 Callable public interface Callab

永不止步 434

JUC - FutureTask(Runnable + Future)

package com.mmall.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; @Slf4j public class FutureTaskExample { ...

503

Java多线程基础-16:简述Java并发编程JUC中的Callable接口

JUC是java.util.concurrent 这个包的简写,其中存放了Java并发框架为协调并发任务所提供的一些工具。本文介绍其中的Callable接口,以及与Callable的使用相关的Future、FutureTask。

wyd_333的博客 828

并发基础之Callable与Future获取异步执行结果

在多线程编码需要获取线程异步执行结果的情况下,我们推荐使用实现Futrue 接口的方式,它比Callable方式多了很多的操作执行线程的方法,比如 cancel() 取消执行、isCancelled () 获取是否取消状态、isDone() 任务是否完成等等。在实际的开发中,我们也推荐使用多线程来创建Futrue获取执行结果。

勤于笔记,成于点滴。 1142

Callable实现多线程

从Java提供多线程开始,最初的方案就是依靠Runnable接口定义线程类核心功能,但是Runnable中的run方法有一个缺点:该方法没有返回值。从JDK1.5开始,在JUC(java.util.concurrent)包中提供了一个新的多线程实现接口: @FunctionalInterface public interface Callable<V>{ public V ...

写写代码 863

JUC(6)Callable与Runnable的区别、Future

文章目录一、Runnable二、Callable(简单)三、FutureTask(很有用)四、Callable 接口和 Runnable接口的区别五、异步回调 Future5.1没有返回值的 runAsync() 异步回调5.2有返回值的supplyAsync() 异步回调5.3与Callable在线程池中的使用 一、Runnable Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然后使用某个线程去执行该runnable即可实现多线程,Thre

wang_luwei的博客 434

JUC多线程:创建线程的四种方式

Java多线程的实现方式主要有四种: (1)继承Thread类,重写run(); (2)实现Runnable接口,重写run(); (3)实现Callable接口,实现call() 方法,通过FutureTask包装器来创建Thread线程; (4)使用ExecutorService、Callable、Future实现有返回结果的多线程。

张维鹏的博客 1万+

[Java多线程]使用callable接口实现多线程

目录 call方法: Future接口: RunnableFuture接口: 泛型相关基础知识: https://blog.youkuaiyun.com/weixin_42645168/article/details/102768764 学习callable接口之前先观察collable接口的包: jdk1.5新增的高并发编程包(JUC) package java.util.concurre...

weixin_42645168的博客 516
上一篇: JAVA多线程基础篇 8、线程隔离与ThreadLocal
下一篇: JAVA多线程进阶篇 11、JUC线程池之ThreadPoolExecutor
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值