Java 线程相关的三个常见接口、类

1. Runnable

  • 最早期的接口,用来封装任务逻辑。
  • 没有返回值、不能抛出受检异常。
java 复制代码
Runnable task = () -> System.out.println("Hello Runnable");
new Thread(task).start();

2. Callable

  • JDK 1.5 引入,和 Runnable 类似,但 有返回值,可以抛出异常。
java 复制代码
Callable<Integer> task = () -> {
    return 42;
};
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<Integer> future = pool.submit(task);
System.out.println(future.get());  // 输出 42

3. Future

  • 代表一个 异步任务的结果 ,用来获取 Callable 执行的返回值。
  • 提供了 get()、cancel()、isDone() 等方法。
java 复制代码
Future<Integer> future = pool.submit(() -> 42);
if (!future.isDone()) {
    System.out.println("任务还没完成");
}
System.out.println(future.get()); // 阻塞等待返回 42

三者关系

  • Runnable:只管执行,无返回值。
  • Callable:可执行 + 有返回值。
  • Future:拿结果的票据,执行完后从这里取。
markdown 复制代码
       Runnable                Callable
         │                        │
         ▼                        ▼
   提交给 ExecutorService(线程池)
                │
                ▼
             Future

一般配合线程池使用:

java 复制代码
ExecutorService pool = Executors.newFixedThreadPool(3);
Future<String> f = pool.submit(() -> "Hello Callable");
System.out.println(f.get()); // 从 Future 拿结果

🔑 口诀

  • Runnable:干活,不给结果。
  • Callable:干活,能返回结果,还能抛异常。
  • Future:小票,凭票取结果。
特性 Runnable Callable<V> Future<V>
所在包 java.lang java.util.concurrent java.util.concurrent
主要作用 封装一个可执行任务 封装一个可执行任务(可返回结果/抛异常) 表示异步任务的结果/控制
核心方法 void run() V call() throws Exception get(), cancel(), isDone(), isCancelled()
返回值 无返回值 有返回值(泛型 V) 保存并提供 Callable/Runnable 的执行结果
异常处理 不能抛出受检异常 可以抛出受检异常 get() 时会封装为 ExecutionException 抛出
使用方式 new Thread(runnable).start() 或提交到线程池 提交到线程池执行 提交任务时返回 Future 对象,用于获取结果
常见场景 简单任务,不关心结果 需要返回计算结果,或可能抛出异常 异步任务结果获取、取消任务
相关推荐
打工仔折腾 AI5 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
蜗牛互联网5 小时前
长任务多Agent共享文件系统的Manifest交接模式
java·人工智能·后端
苏supper7 小时前
Spring Boot多环境配置与打包运行
spring boot·后端·spring
geovindu7 小时前
rust: Composite Pattern
开发语言·后端·设计模式·rust·组合模式
SearchMan8 小时前
还有人不知道&和&&的区别?
后端
想用offer打牌8 小时前
Personal Agent爆火 - 它到底是个什么
人工智能·后端·ai编程
IT_陈寒8 小时前
Vue的v-if和v-for混用居然是个天坑
前端·人工智能·后端
打工仔折腾 AI10 小时前
从Attention到BERT:双向预训练语言模型到底解决了什么问题
人工智能·后端·python·深度学习·语言模型·bert
lizhongxuan11 小时前
Agent Sandbox: Firecracker 任务生命周期
后端
YYYing.11 小时前
【设计模式系列 (七) 】桥接模式
c++·后端·设计模式·桥接模式