使用 Callable + FutureTask 创建线程(带返回值)笔记

一、核心作用

Callable 是带返回值的线程任务接口,配合 FutureTask 可实现 “有返回值的多线程操作”,弥补了 Runnable 无返回值的不足。

二、关键组件

  1. Callable<V> 接口

    • 泛型接口,V 表示返回值类型。
    • 需重写 call() 方法(线程执行体),有返回值且可声明抛出异常。
  2. FutureTask<V> 类

    • 包装 Callable 任务,实现 Runnable 接口(可被线程执行)。
    • 提供 get() 方法,用于获取 call() 的返回值(阻塞等待任务完成)。

三、使用步骤(代码示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 1. 创建 Callable 任务(带返回值的逻辑)
Callable<String> task = new MyThread();

// 2. 用 FutureTask 包装任务(承载结果的容器)
FutureTask<String> futureTask = new FutureTask<>(task);

// 3. 启动线程执行任务(FutureTask 实现了 Runnable)
new Thread(futureTask).start();

// 4. 阻塞获取任务结果(等待任务完成后返回)
String result = futureTask.get();
System.out.println(result); // 输出:和是:4950
System.out.println("=====运行完毕=====");
}
}

// 定义带返回值的线程任务
class MyThread implements Callable<String> {
@Override
public String call() throws Exception { // 可抛异常
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i; // 计算 0~99 的和
}
return "和是:" + sum; // 返回结果
}
}

四、核心特点

  1. 有返回值:通过 call() 方法返回结果,FutureTask.get() 获取。
  2. 可抛异常call() 可声明异常,get() 会抛出 ExecutionException 包装异常。
  3. 阻塞获取get() 会阻塞当前线程,直到任务执行完毕。

五、适用场景

需要线程执行后返回结果的场景(如计算任务、数据查询、异步处理等)。

总结

Callable + FutureTask 是实现 “带返回值线程” 的标准方式,通过 FutureTask 桥接 Callable 与线程,既保留了多线程的并发能力,又能方便地获取任务结果。