当前位置: 首页 > article >正文

Callable

一、Callable 接口定义
@FunctionalInterface
public interface Callable<V> {V call() throws Exception; // 返回类型为泛型V,可抛出异常
}

二、基本使用步骤
1. 定义 Callable 任务
// 示例1:计算两个数的和
Callable<Integer> sumTask = new Callable<>() {@Overridepublic Integer call() throws Exception {return 1 + 2;}
};// 示例2:Lambda简化写法(推荐)
Callable<Integer> sumTask = () -> 1 + 2;
2. 提交任务到线程池
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(2);// 提交任务,返回Future对象
Future<Integer> future = executor.submit(sumTask);
3. 通过 Future 获取结果
try {Integer result = future.get(); // 阻塞直到任务完成System.out.println("结果:" + result); // 输出:3
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
} finally {executor.shutdown(); // 关闭线程池
}

三、Future 核心方法详解
方法作用
V get()阻塞等待任务完成,返回结果。
V get(long timeout, TimeUnit unit)阻塞最多指定时间,超时抛出 TimeoutException
boolean isDone()检查任务是否完成(包括正常结束、异常终止或取消)。
boolean cancel(boolean mayInterrupt)尝试取消任务:若任务未开始,直接取消;若运行中,mayInterrupt=true 会尝试中断。

示例:设置超时和取消任务

Future<Integer> future = executor.submit(() -> {Thread.sleep(3000); // 模拟耗时操作return 100;
});try {Integer result = future.get(1, TimeUnit.SECONDS); // 等待1秒
} catch (TimeoutException e) {System.out.println("任务超时");future.cancel(true); // 中断任务
}

四、处理异常

Callable 抛出的异常会被封装到 ExecutionException 中,需通过 getCause() 获取原始异常:

Callable<Integer> errorTask = () -> {throw new IOException("模拟IO异常");
};Future<Integer> future = executor.submit(errorTask);try {future.get();
} catch (ExecutionException e) {Throwable cause = e.getCause();if (cause instanceof IOException) {System.err.println("捕获到IO异常: " + cause.getMessage());}
}

五、批量提交任务
1. invokeAll:提交多个任务,统一获取结果
List<Callable<Integer>> tasks = Arrays.asList(() -> 1 + 1,() -> 2 + 2,() -> 3 + 3
);List<Future<Integer>> futures = executor.invokeAll(tasks);for (Future<Integer> f : futures) {System.out.println(f.get()); // 输出:2, 4, 6
}
2. invokeAny:提交多个任务,返回第一个完成的结果
Integer result = executor.invokeAny(Arrays.asList(() -> { Thread.sleep(2000); return 10; },() -> { Thread.sleep(1000); return 20; } // 该任务更快完成
));System.out.println(result); // 输出:20

六、使用 FutureTask 直接启动任务

FutureTask 实现了 RunnableFuture,可直接通过 Thread 或线程池执行:

Callable<Integer> task = () -> 5 * 5;
FutureTask<Integer> futureTask = new FutureTask<>(task);// 方式1:通过Thread启动
new Thread(futureTask).start();
System.out.println(futureTask.get()); // 输出:25// 方式2:提交到线程池
executor.submit(futureTask);

七、线程池管理注意事项
  1. 关闭线程池
    使用 shutdown()shutdownNow() 避免资源泄漏:

    executor.shutdown(); // 等待所有任务完成
    // executor.shutdownNow(); // 立即终止所有任务
    
  2. 选择线程池类型

    • newCachedThreadPool:适合短任务,自动回收空闲线程。
    • newFixedThreadPool:固定线程数,适合长期任务。
    • newScheduledThreadPool:支持定时任务。

八、高级用法
1. 结合 Lambda 表达式简化代码
executor.submit((Callable<String>) () -> "Hello, Callable");
2. 使用 CompletableFuture(JDK 8+)

Callable 转换为 CompletableFuture 实现链式调用:

CompletableFuture.supplyAsync(() -> {// 模拟计算return 100;
}, executor).thenAccept(result -> {System.out.println("结果:" + result);
});

九、完整代码示例
import java.util.concurrent.*;public class CallableDemo {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);// 提交任务Future<Integer> future = executor.submit(() -> {Thread.sleep(1000);return 1 + 2;});try {// 设置超时并获取结果Integer result = future.get(2, TimeUnit.SECONDS);System.out.println("结果:" + result);} catch (TimeoutException e) {System.err.println("任务超时");} catch (ExecutionException e) {System.err.println("任务异常:" + e.getCause());} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {executor.shutdown();}}
}

相关文章:

Callable

一、Callable 接口定义 FunctionalInterface public interface Callable<V> {V call() throws Exception; // 返回类型为泛型V&#xff0c;可抛出异常 }二、基本使用步骤 1. 定义 Callable 任务 // 示例1&#xff1a;计算两个数的和 Callable<Integer> sumTask …...

Honeywell 05701-A-0302 单通道控制卡

Honeywell 05701-A-0302 是System 57系列中的单通道控制卡&#xff0c;专为工业气体检测和火灾报警系统设计。该控制卡为系统提供单个检测通道的完整控制解决方案&#xff0c;包括传感器驱动、信号采集和报警管理功能。 主要特性 单通道控制&#xff1a;支持单个气体传感器或火…...

爱普生晶振赋能UWB汽车数字钥匙,解锁未来出行新方式

随着科技的发展&#xff0c;尤其是国产新能源汽车的崛起&#xff0c;相信大家对数字钥匙的概念已经不陌生了&#xff0c;通过手机、智能穿戴实现对汽车的多功能控制已经是很多汽车的标配。但是目前数字钥匙也有一定的局限性&#xff0c;比如定位不准、安全性不强等等&#xff0…...

电子电路:深入理解电磁耦合的定义与应用

电场和磁场是独立存在的吗&#xff1f;&#xff0c;但实际上根据麦克斯韦理论&#xff0c;它们是同一现象的两个方面&#xff0c;通过变化相互产生。这时候需要强调时变场的重要性&#xff0c;以及静态场和动态场的区别。 通过电磁波的概念&#xff0c;说明电磁耦合如何导致电…...

宝塔安装的 MySQL 无法连接的情况及解决方案

宝塔安装的 MySQL 无法连接的情况及解决方案 宝塔面板是一款流行的服务器管理工具&#xff0c;其中集成的 MySQL 数据库有时会出现连接问题。本文详细介绍两种最常见的 MySQL 连接错误&#xff1a;“1130 - Host is not allowed to connect” 和 “1045 - Access denied”&…...

今日行情明日机会——20250523

上证指数缩量下跌&#xff0c;个股下跌超过4000个&#xff0c;总体跌多涨少&#xff0c;日线总体处于高位&#xff0c;注意风险。 深证60分钟级别下跌趋势线压制&#xff0c;总体日线转下跌的概率大&#xff0c;注意风险。 2025年5月23日涨停股主要行业方向分析 一、核心主…...

微服务项目->在线oj系统(Java版 - 4)

相信自己,终会成功 目录 B端用户管理 C端用户代码 发送验证码: 验证验证码 退出登录 登录用户信息功能 用户详情与用户编辑 用户竞赛接口 用户报名竞赛 用户竞赛报名接口查询 用户信息列表 ThreadLocalUtil Hutool工具库 常用功能介绍 B端用户管理 进行列表显示与…...

ReAct 与 CoAct:AI 代理的推理与行动之旅

引言 能推理又能行动的 AI 代理&#xff0c;是朝着构建更自主系统迈出的重要一步。传统上&#xff0c;语言模型在“思维链”提示方面表现得很出色&#xff0c;也就是通过文本逐步思考问题来解决像算术、常识问题或符号推理这类任务。但用思维链时&#xff0c;模型只依赖自身的…...

电子电路:什么是滤波器,什么优势高通滤波器?

滤波器在信号处理中的基本类型有哪些?通常可能包括低通、高通、带通、带阻等。每种滤波器根据频率的不同来允许或阻止信号通过。高通滤波器就是其中一种,允许高频通过,衰减低频。 滤波器的实现方式,分为模拟和数字两种。模拟滤波器使用电阻、电容、电感等元件,而数字滤波…...

uni-app使用大集

1、手动修改页面标题 uni.setNavigationBarTitle({title: 修改标题 }); 2、单选 不止有 radio-group&#xff0c;还有 uni-data-checkbox 数据选择器 <!-- html部分 --> <uni-data-checkbox v-model"sex" :localdata"checkboxList"></u…...

[Spring Boot]整合Java Mail实现Outlook发送邮件

日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。 Outlook作为微软提供的企业电子…...

零件剖切配置教学 | 玩转EasyTwin 工业产线第三期(上)课程回顾

-在工业数字孪生领域&#xff0c;工程施工模拟、车间产线运转、机械装置和零件配置等交互效果的呈现至关重要。通过EasyTwin&#xff0c;我们能够以更低成本、更高效率来构建数字孪生场景&#xff0c;但在搭建的过程中&#xff0c;也会因为复杂的场景交互配置产生一些疑问。该案…...

onnx模型转入rknn3399平台上工作记录

1.rknn虚拟环境使用时报错问题 使用rknn17环境的报错&#xff1a; ImportError: libdc1394.so.22: cannot open shared object file: No such file or directory 参考链接&#xff1a;https://blog.csdn.net/2301_80032564/article/details/142316410 创作软连接&#xff1a; …...

进考场!软考考试现场答题的注意事项

明天就要考试啦&#xff0c;简单说几条比较重要的考场答题注意事项&#xff1a; 选择题方面&#xff0c;一定要注意的是不要恋战&#xff0c;注意把握答题时间&#xff0c;对自己比较熟悉和有把握的题目按照顺序进行作答即可&#xff0c;但是对于不确定的题目或者需要大量时间计…...

第三个小程序动工:一款结合ai的菜谱小程序

1.环境搭建&#xff0c;与初步运行 安装及使用 | Taro 文档 找到一个合适的文件夹&#xff0c;cmd D:\gitee>pnpm install -g tarojs/cli╭──────────────────────────────────────────╮│ …...

OpenCV CUDA 模块图像过滤------创建一个线性滤波器(Linear Filter)函数createLinearFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于创建一个线性滤波器&#xff08;Linear Filter&#xff09;&#xff0c;可以对图像执行任意用户定义的卷积核&#xff08;kernel&…...

广告反作弊都有哪些方法

1. 基础检测手段 通过分析用户行为数据&#xff0c;识别异常点击模式&#xff1a; 频率检测&#xff1a;同一IP、设备ID、用户ID在短时间内多次点击广告&#xff08;如1秒内多次点击&#xff09;。可设定阈值&#xff08;如每小时最多5次点击&#xff09;&#xff0c;超过即标…...

Excel 密码忘记了?巧用PassFab for Excel 解密帮您找回数据!

在工作中&#xff0c;你是否遇到过这样的尴尬时刻&#xff1f;打开重要的 Excel 文件&#xff0c;却发现忘记密码&#xff0c;里面的财务报表、客户数据、项目计划瞬间变成 “加密天书”。重新制作耗时耗力&#xff0c;找专业人员解密又担心数据泄露&#xff0c;这个时候&#…...

Vue.js教学第十二章:Vue Router实战指南(二)

Vue Router(二):深入剖析 Vue Router 高级特性 在前端开发领域,Vue.js 框架凭借其简洁、灵活和高效的特点,得到了广泛应用。而 Vue Router 作为 Vue.js 的官方路由管理器,为构建单页面应用(SPA)提供了强大的支持。本文将深入探究 Vue Router 的高级特性,包括路由的动…...

【前端开发】Uniapp日期时间选择器:实现分钟动态步长设置

技术栈 Uniapp Vue3 uView年份显示前后一年&#xff0c;分钟动态设置间隔 效果图 主体显示 <view class"uni-row-between selector"><view class"uni-flex-1 left" click"!props.disabled && openPicker()"><uni-icons…...

跑通Multi-Agent-Constrained-Policy-Optimisation

✅ 1. 克隆项目并创建 Conda 环境 git clone https://github.com/chauncygu/Multi-Agent-Constrained-Policy-Optimisation.git cd Multi-Agent-Constrained-Policy-Optimisation conda create --prefix ./envs python3.7 -y conda activate ./envs✅ 2. 安装 PyTorch 和依赖 …...

Visual Studio已更新为17.14+集成deepseek实现高效编程

01 Visual Studio 2022 v17.14。 此更新侧重于全面提供出色的开发人员体验&#xff0c;侧重于稳定性和安全性以及 AI 改进。 02 GPT-4o代码完成模式 我们非常高兴地宣布&#xff0c;新的 GPT-4o Copilot 代码完成模型现已在 Visual Studio 17.14 中为 GitHub Copilot 用户…...

go 基础语法 【教程 go tour】

go 基础语法 【1】 教程go tour 1 包 变量 函数 变量不用声明 func swap(x, y string) (string, string) {return y, x }func main() {a, b : swap("hello", "world")fmt.Println(a, b) }也可以声明&#xff1a; 没有明确初始化的变量声明会被赋予对应…...

养生指南:五维打造健康新方式

一、饮食&#xff1a;天然搭配&#xff0c;科学进食 遵循 “食物多样化” 原则&#xff0c;早餐以红薯玉米粥搭配水煮蛋、凉拌黄瓜&#xff0c;开启活力一天&#xff1b;午餐选用糙米饭、番茄炖牛腩、蒜蓉空心菜&#xff0c;营养均衡&#xff1b;晚餐用冬瓜虾皮汤配上蒸芋头&a…...

网络爬虫学习之httpx的使用

开篇 本文整理自《Python3 网络爬虫实战》&#xff0c;主要是httpx的使用。 笔记整理 使用urllib库requests库的使用&#xff0c;已经可以爬取绝大多数网站的数据&#xff0c;但对于某些网站依然无能为力。 这是因为这些网站强制使用HTTP/2.0协议访问&#xff0c;这时urllib和r…...

无人机桥梁检测效率问题-高精度3D建模及航线规划

无人机桥梁检测效率问题-高精度3D建模及航线规划 无人机桥梁检测的效率分析 结论-并没有提升效率 飞行任务制定步骤繁琐且续航限制 需要首先对大桥建立高精度的3D建模&#xff0c;根据任务制定无人机的飞行路径以及动作&#xff0c;商用无人机续航通常仅30-40分钟&#xff0c…...

想免费使用 AWS 云服务器?注册、验证及开通全攻略

拥有一台 AWS 免费云服务器&#xff0c;可以轻松搭建个人网站、博客或部署 ChatGPT 等 AI 服务。本文详解如何 注册 AWS 账号、完成 信用卡验证&#xff0c;并在 AWS 控制台中 开通 EC2 实例&#xff0c;享受长达 12 个月的免费额度。 提示&#xff1a; 国内信用卡及银联借记卡…...

以太联 - Intellinet 闪耀台北 SecuTech 国际安全科技应用博览会

2025 年 5 月 7 日至 9 日&#xff0c;台北 SecuTech 国际安全科技应用博览会现场热闹非凡&#xff0c;以太联 - Intellinet 携旗下前沿产品与解决方案精彩亮相&#xff0c;成为展会上一道亮丽的风景线&#xff0c;吸引了众多业内人士的目光&#xff0c;收获了广泛关注与高度认…...

Pandas:数据分析中的缺失值检测、加载、设置、可视化与处理

本文目录&#xff1a; 一、检测数据集中的缺失值&#xff08;一&#xff09;缺失值的判断规则&#xff1a;&#xff08;二&#xff09;代码如下&#xff1a; 二、缺失值加载处理&缺失值设置&#xff08;一&#xff09;缺失值加载处理&#xff08;二&#xff09;缺失值设置 …...

【Linux系列】EVS 与 VBD 的对比

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...