
Future 是 Java 5 引入的异步编程接口,用于表示一个异步任务的结果。它提供了对异步任务的基本控制能力,如获取结果、取消任务等。
1、使用示例
通过 ExecutorService 提交 Callable(有返回值)或 Runnable(无返回值)的异步任务,返回 Future 对象。 然后通过 Future 的方法获取任务结果或控制任务。
import java.util.concurrent.*;
public class FutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 1. 创建线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
// 2. 提交有返回值的任务(Callable),返回Future对象
Future<String> future = executor.submit(() -> {
// 模拟耗时操作(如网络请求、数据库查询)
Thread.sleep(1000);
return "异步任务结果";
});
// 3. 主线程可做其他事情
System.out.println("主线程执行其他任务...");
// 4. 获取异步任务结果(会阻塞,直到任务完成)
String result = future.get();
System.out.println("获取到结果:" + result);
// 5. 关闭线程池
executor.shutdown();
}
}
2、核心方法
| 方法 | 作用 |
|---|---|
get() | 阻塞当前线程,直到任务完成并返回结果;若任务异常,抛出 ExecutionException。 |
get(long timeout, TimeUnit unit) | 带超时时间的获取结果,超时未完成则抛出 TimeoutException。 |
cancel(boolean mayInterruptIfRunning) | 取消任务:若任务未执行,直接取消;若已执行,mayInterruptIfRunning 为 true 则中断任务。 |
isDone() | 判断任务是否已完成(正常完成、异常或被取消)。 |
isCancelled() | 判断任务是否被取消。 |
3、优点 :异步获取数据,提高接口响应
Future 适用于简单的异步场景(如单个异步任务的执行和结果获取),在编程中,能够对接口中存在时间较长的操作执行异步任务,让主线程去完成其他辅助任务,等异步任务执行完出结果之后继续执行。
Future 结果获取使用 get() 方法,会阻塞当前线程,直到任务完成。
4、缺点:获取结果必须阻塞或轮询
get() 方法会阻塞当前线程,直到任务完成,若任务耗时过长,会导致主线程效率低下。若不想阻塞,需通过 isDone() 轮询判断任务是否完成,这会浪费 CPU 资源。
// 轮询方式(低效)
while (!future.isDone()) {
// 等待任务完成,空转消耗CPU
Thread.sleep(100);
}
String result = future.get();
5、缺点:无法链式操作
若需要多个异步任务按顺序执行(如任务A完成后执行任务B,依赖A的结果),Future 无法直接实现,需手动嵌套,代码冗长且可读性差。
// 嵌套实现链式任务
Future<String> futureA = executor.submit(() -> "A");
// 任务阻塞主线程,不能做其他操作,不如直接获取
String resultA = futureA.get();
Future<String> futureB = executor.submit(() -> resultA + "B");
6、缺点:无法组合多个任务
若需要等待多个任务都完成后合并结果或取多个任务中先完成的结果,Future 没有原生支持,需手动实现(如用计数器判断所有任务是否完成),逻辑复杂。
7、缺点:异常处理繁琐
任务执行中的异常会被封装在 ExecutionException 中,需通过 get() 方法捕获,且无法在任务执行过程中主动处理异常,容易导致异常被忽略(如忘记捕获)。
try {
String result = future.get();
} catch (ExecutionException e) {
// 需手动获取底层异常
Throwable cause = e.getCause();
System.out.println("任务异常:" + cause.getMessage());
}
8、缺点:不支持异步回调
Future 没有回调机制,无法在任务完成时自动触发后续操作,必须主动调用 get() 或轮询,不符合事件驱动的异步编程模式。
Java 8 引入的 CompletableFuture 弥补了这些缺陷,它实现了 Future 接口并扩展了 CompletionStage 接口,支持链式操作、任务组合、异步回调和便捷的异常处理,是更强大的异步编程工具。
1389

被折叠的 条评论
为什么被折叠?



