并发 - Callable 与 Future

news/2026/1/21 16:05:51/文章来源:https://www.cnblogs.com/liushoushou/p/19512377

知识点 5.1:并发编程进阶 —— Callable 与 Future

在学习了 Runnable 之后,我们很快会发现它的两个主要局限:

  1. run() 方法没有返回值。
  2. run() 方法不能抛出受检异常。

为了解决这两个问题,JUC 提供了一对更强大的组合:CallableFuture

1. 核心理论:Callable 接口

java.util.concurrent.Callable 是一个类似于 Runnable 的接口,但功能更强。

@FunctionalInterface
public interface Callable<V> {V call() throws Exception;
}

从源码可以看出它与 Runnable 的三大区别:

  1. 方法名不同: 一个是 call(),一个是 run()
  2. 有返回值: call() 方法可以返回一个泛型 V 的结果。
  3. 能抛出异常: call() 方法的签名上声明了 throws Exception,这意味着你可以在任务中抛出受检异常。

2. 深度剖析:Future —— 未来的“提货单”

既然 Callable 能返回结果,那我们怎么获取这个结果呢?

直接用一个变量去接 call() 的返回值是行不通的,因为 call() 是在另一个线程中异步执行的。主线程提交任务后,不会傻傻地一直等着,它会继续做自己的事。

为了解决这个问题,JUC 设计了 Future 接口。当你把一个 Callable 任务提交给线程池时,线程池会立刻返回一个 Future 对象。这个 Future 对象就像一张“提货单”“承诺书”

Future 接口的核心方法:

  • V get(): 这是一个阻塞方法。当主线程调用它时:

    • 如果任务已经执行完毕,它会立刻返回 Callable 的执行结果。
    • 如果任务还在执行中,主线程会阻塞在这里,一直等到任务执行完毕再返回结果。
    • 如果任务在执行过程中抛出了异常,那么 get() 方法会把那个异常原封不动地再次抛出来。
  • V get(long timeout, TimeUnit unit): 带超时的 get()。主线程最多只阻塞指定的时间。如果超时后任务还没完成,会抛出 TimeoutException

  • boolean isDone(): 判断任务是否已经执行完成(无论是正常完成、异常终止还是被取消)。这个方法是非阻塞的,常用于轮询。

  • boolean cancel(boolean mayInterruptIfRunning): 尝试取消任务的执行。


3. 生活中的例子与代码示例

  • 生活比喻: 你去一家高级咖啡店点了一杯手冲咖啡(一个耗时的 Callable 任务)。

    • 你下单后,店员不会让你站在原地干等,而是会给你一个取餐牌Future 对象),然后你就可以回到座位上玩手机了(主线程继续执行)。
    • 你随时可以看一眼取餐牌上的状态灯(调用 isDone()),看看咖啡好了没。
    • 当你觉得差不多了,就拿着取餐牌去柜台取咖啡(调用 get())。如果咖啡师正在做,你就得在柜台前等一会儿(get() 阻塞)。如果咖啡做好了,你就能拿到咖啡(获取返回值)。如果制作过程中咖啡豆用完了(任务抛出异常),店员会告诉你这个坏消息(get() 抛出异常)。
  • 核心代码示例:

package com.study.concurrency;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CallableAndFutureExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);// 传统方式:创建一个实现了 Callable 接口的类Callable<String> traditionalTask = new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(1000);return "传统方式执行完毕";}};Future<String> future1 = executor.submit(traditionalTask);// Lambda 方式 (Java 8+ 推荐)// 因为 Callable 也是函数式接口,所以可以直接用 Lambda 表达式Callable<String> lambdaTask = () -> {Thread.sleep(2000);// 模拟抛出异常if (true) { // a conditionthrow new IllegalStateException("Lambda 任务出错了");}return "Lambda 方式执行完毕";};Future<String> future2 = executor.submit(lambdaTask);System.out.println("主线程:已提交2个任务。");try {System.out.println("获取传统任务结果: " + future1.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}try {System.out.println("获取 Lambda 任务结果: " + future2.get());} catch (InterruptedException | ExecutionException e) {// 注意:原始异常被包装在 ExecutionException 中System.err.println("获取 Lambda 任务结果时出错: " + e.getCause());}executor.shutdown();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麦橘超然性能压测报告:单次生成耗时统计

麦橘超然性能压测报告&#xff1a;单次生成耗时统计 1. 引言&#xff1a;为什么这次压测值得关注 你有没有遇到过这样的情况&#xff1a;满怀期待地输入一段精美的提示词&#xff0c;点击“生成”&#xff0c;然后盯着进度条一动不动&#xff0c;等了快一分钟才出图&#xff…

2026营口市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜

基于《2025-2026年中国雅思考试行业白皮书》核心数据,结合营口市站前区、西市区、鲅鱼圈区、老边区、盖州市、大石桥市近三年雅思考生备考反馈(有效样本量1500+),本次开展全面深度测评,聚焦雅思培训选课核心痛点,…

fft npainting lama高阶使用技巧:分层修复与边缘羽化实战案例

fft npainting lama高阶使用技巧&#xff1a;分层修复与边缘羽化实战案例 1. 引言&#xff1a;图像修复不只是“一键去物” 你有没有遇到过这种情况&#xff1a;想从照片里去掉一个碍眼的路人&#xff0c;结果修复完边缘生硬得像被刀切过&#xff1f;或者处理一张复杂背景的广…

企业级通信如何选型?(MCP与OpenAI Function Calling技术对决揭秘)

第一章&#xff1a;企业级通信选型的底层逻辑与技术分野 在构建现代分布式系统时&#xff0c;企业级通信机制的选择直接影响系统的可扩展性、容错能力与维护成本。通信架构不仅涉及数据传输方式&#xff0c;更深层地反映了服务治理理念与技术栈的协同逻辑。 同步与异步通信的本…

OOP 经典对比

知识点 4.5:OOP 经典对比 1. 重写 (Override) vs 重载 (Overload) 这是 Java 多态性中两个非常重要且容易混淆的概念。 什么是重写 (Override)? 重写是指子类可以重新定义从父类继承来的、具有相同方法签名(方法名和…

YOLOv11+BiFPN革新小麦杂质检测技术

Key Points - 本报告的核心发现与结论&#xff08;3-5项&#xff09;&#xff1a;YOLOv11 BiFPN 技术组合具备高精度、实时性与强鲁棒性&#xff0c;是小麦杂质检测系统的理想技术选型&#xff1a;该架构通过双向特征融合机制显著提升小目标&#xff08;如尘土、石子&#xff…

手把手教你实现MCP服务器resources热更新,动态调整不再重启服务

第一章&#xff1a;MCP服务器热更新机制概述 在现代高可用服务架构中&#xff0c;MCP&#xff08;Modular Control Plane&#xff09;服务器作为核心控制组件&#xff0c;其持续稳定运行至关重要。热更新机制允许系统在不中断服务的前提下动态加载新代码或配置&#xff0c;极大…

山石网科各硬件产品Console配置口波特率汇总

SG-6000 E/C/P/Z/ISC Probe/LMS 系列设备提供 1 个符合 RS-232C 异步串行规范的配置口(CON 口)。配置口的属性及描述如下表所示:属性 描述连接器类型 RJ-45端口类型 RS-232C波特率 9600bit/s支持服务 与终端的串口相…

揭秘Dify Iteration节点:如何高效处理复杂列表数据?

第一章&#xff1a;揭秘Dify Iteration节点的核心能力 Dify的Iteration节点是工作流编排中实现循环逻辑的关键组件&#xff0c;允许开发者对一组数据进行逐项处理&#xff0c;显著提升自动化流程的灵活性与可扩展性。通过该节点&#xff0c;用户可以在无需编写额外代码的情况下…

基于51单片机智能手环老人防跌倒报警器GSM短信上报设计套件106(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于51单片机智能手环老人防跌倒报警器GSM短信上报设计套件106(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 51单片机智能老人防跌倒报警器GSM短信上报106产品功能描述&#xff1a; 本系统由STC89C52单片机、ADXL345加速度传…

为什么FSMN VAD总检测失败?参数调优实战教程入门必看

为什么FSMN VAD总检测失败&#xff1f;参数调优实战教程入门必看 你是不是也遇到过这种情况&#xff1a;明明音频里有清晰的说话声&#xff0c;FSMN VAD却一点反应都没有&#xff1f;或者语音被莫名其妙地截断&#xff0c;片段切得支离破碎&#xff1f;别急&#xff0c;这并不…

Live Avatar降本部署方案:单GPU+CPU offload低配环境实操教程

Live Avatar降本部署方案&#xff1a;单GPUCPU offload低配环境实操教程 1. 背景与挑战&#xff1a;为什么80GB显存成硬门槛&#xff1f; Live Avatar是由阿里联合高校开源的一款高质量数字人生成模型&#xff0c;支持从文本、图像和音频输入驱动虚拟人物的口型、表情与动作&…

RTX5060显卡对PyTorch与CUDA适配问题解决方案(解决环境依赖问题AI微调部署前奏)

前言 如果大家的电脑显卡是RTX50系列的话&#xff0c;如果按照正常的部署AI&#xff0c;可能尚未进行调试&#xff0c;就会发现环境的依赖报错一大堆&#xff0c;又或者如下图的UserWarning&#xff0c;之所以会是这样&#xff0c;是因为5060的显卡太新了&#xff0c;以至于Py…

2026锦州市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜

基于全国雅思培训行业权威调研、锦州市太和区、古塔区、凌河区多维度考生反馈及第三方教育测评认证,本次围绕雅思培训选课核心需求,结合考试提分规律、优质机构筛选标准、高分技巧传授、性价比适配等关键维度,开展深…

强化学习十年演进

结论&#xff1a;未来十年&#xff08;2025–2035&#xff09;&#xff0c;强化学习将从“样本密集的实验室算法”演进为“多模态、能效优先与社会协同的工程化技术栈”&#xff0c;在北京的机器人与自动驾驶落地应优先关注多模态感知RL、节能&#xff08;Green&#xff09;RL …

紧急警告:错误配置导致Claude Desktop丢失MCP Server连接(附修复方案)

第一章&#xff1a;紧急警告&#xff1a;错误配置导致Claude Desktop丢失MCP Server连接 近期多个用户报告&#xff0c;在更新 Claude Desktop 客户端后&#xff0c;应用无法连接至本地运行的 MCP&#xff08;Model Control Plane&#xff09;Server&#xff0c;表现为连接超时…

GEO优化公司推荐哪家好?从技术深度到服务能力的权威解析!

随着生成式搜索与AI问答逐渐成为主流信息入口,企业在“被搜索”之外,开始进入“被理解、被引用、被推荐”的新竞争阶段。由此,GEO正在成为企业数字增长的重要基础设施。面对市场上不断涌现的GEO服务商,企业最关心的…

广东激光熔敷公司怎么选,哪家口碑好?

问题1:广东专业激光熔敷哪家专业?激光熔敷技术在锅炉修复中的核心优势是什么? 在广东的工业防腐防磨领域,广东博盈特焊技术股份有限公司是专业激光熔敷服务的标杆企业。作为2026年深交所创业板上市企业(证券代码:…

Pinterest注册失败怎么办?2026最新解决指南在这里

Pinterest作为全球最大的视觉搜索引擎之一&#xff0c;吸引了无数用户加入。然而&#xff0c;很多用户在注册过程中会遇到各种问题&#xff0c;从账号信息填写不完整&#xff0c;到IP地址被识别为异常&#xff0c;种种障碍常常让人感到沮丧。如果你也在Pinterest注册过程中碰壁…

Unsloth资源占用监控:GPU显存与CPU使用率跟踪方法

Unsloth资源占用监控&#xff1a;GPU显存与CPU使用率跟踪方法 你是否在使用Unsloth进行大模型微调时&#xff0c;遇到过显存爆满、训练中断或CPU负载异常的情况&#xff1f;尤其是在本地环境或云服务器上运行LLM&#xff08;大语言模型&#xff09;任务时&#xff0c;资源监控…