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 对象,用于获取结果
常见场景 简单任务,不关心结果 需要返回计算结果,或可能抛出异常 异步任务结果获取、取消任务
相关推荐
步行cgn1 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
码事漫谈2 小时前
AI 读你的提示词,其实很没耐心
后端
用户8356290780512 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我123452 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
IT_陈寒3 小时前
Java性能优化完全指南
前端·人工智能·后端
电子IT笔记3 小时前
对接群晖NAS,上传和删除踩坑记录
前端·后端
Mk598783 小时前
P4:把 Agent 的记忆搬进 Redis —— AgentScope-Java 工程化实战
后端
雨中飘荡的记忆3 小时前
Claude Code 入门必会:@、!、Slash Commands,一篇讲清楚
人工智能·后端
用户8356290780513 小时前
如何使用 Python 在 Word 文档中创建和格式化列表
后端·python
开心就好20253 小时前
uni-app 本地打包 iOS,在 Windows 上使用 KXBuild 产出 ipa 并上架的完整流程
后端·ios