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 对象,用于获取结果
常见场景 简单任务,不关心结果 需要返回计算结果,或可能抛出异常 异步任务结果获取、取消任务
相关推荐
武子康21 小时前
大数据-139 ClickHouse MergeTree 最佳实践:Replacing 去重、Summing 求和、分区设计与物化视图替代方案
大数据·后端·nosql
该用户已不存在21 小时前
7个让全栈开发效率起飞的 Bun 工作流
前端·javascript·后端
清空mega21 小时前
从零开始搭建 flask 博客实验(2)
后端·python·flask
G_dou_1 天前
Rust安装
开发语言·后端·rust
9ilk1 天前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
一枚码仔1 天前
SpringBoot启动时执行自定义内容的5种方法
java·spring boot·后端
桦说编程1 天前
如何在Java中实现支持随机访问的固定窗口队列
java·数据结构·后端
oak隔壁找我1 天前
Spring框架中的跨域CORS配置详解
java·后端
想不明白的过度思考者1 天前
Rust——或模式(Or Patterns)的语法:Rust模式匹配的优雅演进
开发语言·后端·rust·模式匹配
JimmtButler1 天前
RocketMQ本地编译
后端·rocketmq