Callable与Future结合可实现异步任务执行并获取结果。1. Callable是泛型接口,call()方法能返回值并抛出异常;2. Future代表异步计算结果,提供get()、isDone()、cancel()等方法控制任务;3. 通过ExecutorService提交Callable任务获得Future对象,调用get()阻塞获取结果或设超时;4. 适用于批量请求、并行处理等需返回值的并发场景,注意异常处理与线程池管理。
在Java中,Cal
lable 和 Future 结合使用可以实现异步任务执行并获取返回结果。与 Runnable 不同,Callable 可以返回结果,也能抛出异常,配合 Future 可以检查任务是否完成、获取结果或取消任务。
Callable 是一个泛型接口,定义了一个 call() 方法,该方法可以返回指定类型的值,并能抛出异常:
public interface Callable{ T call() throws Exception; }
Future 代表异步计算的结果,提供了以下关键方法:
结合线程池(ExecutorService)提交 Callable 任务,返回 Future 对象进行控制:
import java.util.concurrent.*;
public class CallableFutureExample {
public static void main(String[] args) {
// 创建线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
// 定义 Callable 任务
Callable task = () -> {
System.out.println("任务开始执行...");
Thread.sleep(2000);
return 42; // 模拟计算结果
};
// 提交任务,返回 Future
Future future = executor.submit(task);
try {
// 主线程做其他事
System.out.println("主线程继续执行...");
// 获取结果(会阻塞)
Integer result = future.get(); // 或使用超时版本
System.out.println("任务结果:" + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}
适合用于需要并发执行多个耗时任务并汇总结果的场景,例如:
使用 get() 时注意可能引发的阻塞,合理设置超时时间避免程序挂起。
基本上就这些,Callable + Future 提供了比 Runnable 更灵活的任务控制能力,是 Java 并发编程中的常用组合。不复杂但容易忽略细节,比如异常处理和线程池管理。