0

0

Java中的Callable与Future接口的使用

P粉602998670

P粉602998670

发布时间:2026-01-18 16:41:19

|

434人浏览过

|

来源于php中文网

原创

callable比runnable多返回结果和抛出受检异常的能力;其call()方法必须有返回值且可声明throws任何异常,而runnable的run()方法返回void且不能抛出受检异常。

java中的callable与future接口的使用

Callable比Runnable多什么能力

Callable能返回结果、抛出受检异常,而Runnable不能。这是最根本的区别——如果你的任务需要计算一个值(比如查数据库后返回ID),或者可能遇到IOException这类必须处理的异常,就该用Callable,而不是硬套Runnable

注意:Callable的泛型参数就是返回类型,比如Callable<string></string>表示执行后返回String;而Runnable.call()不存在,它的方法叫run()且无返回值。

  • Callable.call() 方法必须有返回值,且可声明 throws 任何异常
  • Runnable.run() 方法返回 void,不能抛出受检异常
  • 直接 new Thread(new Runnable()) 可以启动,但 new Thread(new Callable()) 编译不通过——Callable 不能直接交给 Thread

Future.get() 为什么会阻塞,怎么避免卡死

Future.get() 是同步等待结果的操作,调用时线程会挂起,直到任务完成或超时。常见错误是没设超时,结果依赖的服务响应慢,整个线程被拖住。

推荐始终使用带超时的重载:future.get(3, TimeUnit.SECONDS)。超时后抛出TimeoutException,你可以降级、重试或记录告警,而不是让线程无限等下去。

立即学习Java免费学习笔记(深入)”;

WeWedding婚纱影楼小程序
WeWedding婚纱影楼小程序

婚纱影楼小程序提供了一个连接用户与影楼的平台,相当于影楼在微信的官网。它能帮助影楼展示拍摄实力,记录访客数据,宣传优惠活动。使用频率高,方便传播,是影楼在微信端宣传营销的得力助手。功能特点:样片页是影楼展示优秀摄影样片提供给用户欣赏并且吸引客户的。套系页是影楼根据市场需求推出的不同套餐,用户可以按照自己的喜好预定套系。个人中心可以查看用户预约的拍摄计划,也可以获取到影楼的联系方式。

下载
  • 不带参数的 get() 可能永远阻塞(比如任务死循环或未提交)
  • 超时单位别写错:TimeUnit.MILLISECONDSTimeUnit.SECONDS 差1000倍
  • 如果任务已取消,get() 会抛 CancellationException,需单独捕获
try {
    String result = future.get(2, TimeUnit.SECONDS);
    System.out.println(result);
} catch (TimeoutException e) {
    System.err.println("任务超时,执行降级逻辑");
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    System.err.println("任务执行异常:" + cause.getClass().getSimpleName());
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 恢复中断状态
}

submit(Callable) 返回的 Future 能取消吗

可以,但是否真正生效取决于任务当前状态和实现方式。future.cancel(true)true 表示「尝试中断正在运行的线程」,但这只是个提示——线程是否响应中断,由任务自己决定。

比如你在call()里写了while (!Thread.currentThread().isInterrupted())并定期检查,那中断才有效;如果任务在做纯 CPU 计算且没检查中断,cancel 就不会停止它。

  • 任务还没开始:cancel 成功,状态变为 isCancelled() == true
  • 任务正在运行:仅当线程响应中断(如调用 Thread.sleep()BlockingQueue.take() 等可中断方法)才会退出
  • 任务已完成:cancel 失败,isCancelled() 返回 false,isDone() 返回 true

为什么常用 ExecutorService.submit(Callable) 而不是直接 new FutureTask

直接 new FutureTask 是可行的,但它要你手动管理线程(比如传给new Thread(task).start()),容易漏掉异常处理、线程复用、资源关闭等问题。而ExecutorService.submit() 内部封装了这些,还统一了生命周期管理。

更重要的是:ExecutorService 支持批量提交、优雅关闭(shutdownNow() 会尝试 cancel 所有未完成的 Future)、以及线程池复用——这对高频小任务很关键。

  • FutureTaskRunnableFuture 的组合,适合需要手动控制执行时机的场景(比如延迟触发)
  • 日常异步任务,优先走 executor.submit(new MyCallable()),别绕路
  • 别忘了在应用退出前调用 executor.shutdown()shutdownNow(),否则 JVM 可能不退出

真正容易被忽略的点是:Future 不代表任务一定在执行中——它只是一张“凭证”,背后任务可能已被拒绝、取消、或甚至还没排上队。判断状态得靠 isDone()isCancelled() 配合 get() 的异常类型,不能光看 future 对象是否存在。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

126

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1846

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

614

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2351

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.8万人学习

Java 教程
Java 教程

共578课时 | 78.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号