Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。(因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果)
在 Java 中,Future
是一个接口,用于表示异步计算的结果。
它主要用于处理那些需要一段时间才能完成的任务,并且可以在任务完成前或完成后获取结果、检查任务状态、取消任务等。Future
常常与 ExecutorService
一起使用,来管理和控制并发任务的执行。
主要功能和使用场景
-
获取结果:
V get()
: 阻塞当前线程,直到任务完成并返回结果。V get(long timeout, TimeUnit unit)
: 在指定时间内阻塞当前线程,如果任务在指定时间内完成,则返回结果;否则抛出TimeoutException
。
-
检查任务状态:
boolean isDone()
: 检查任务是否已经完成。boolean isCancelled()
: 检查任务是否已经被取消。
-
取消任务:
boolean cancel(boolean mayInterruptIfRunning)
: 尝试取消任务。如果任务已经完成或已经取消,则返回false
;否则返回true
。如果mayInterruptIfRunning
为true
,则尝试中断正在执行的任务。
示例
下面是一个使用 Future
和 ExecutorService
的示例,展示了如何提交一个任务并获取其结果:
import java.util.concurrent.*;
public class FutureExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
// 提交一个 Callable 任务,返回一个 Future
Future<Integer> future = executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(2000); // 模拟耗时操作
return 42;
}
});
try {
// 阻塞等待任务完成并获取结果
Integer result = future.get();
System.out.println("任务结果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
// 关闭 ExecutorService
executorService.shutdown();
}
}
主要使用场景
- 异步计算:当一个任务需要长时间运行,而你希望在任务完成后再获取结果时,可以使用
Future
。 - 任务取消:如果需要在任务执行过程中取消任务,可以使用
Future
的cancel
方法。 - 任务状态检查:如果需要检查任务是否已经完成或被取消,可以使用
Future
的isDone
和isCancelled
方法。
注意事项
- 阻塞调用:
get
方法是阻塞的,直到任务完成。如果任务长时间不完成,调用线程会被阻塞。 - 异常处理:如果任务抛出异常,
get
方法会抛出ExecutionException
,其中包含任务的异常。 - 资源管理:使用完
ExecutorService
后,应该调用shutdown
方法来优雅地关闭线程池,释放资源。
总结
Future
是一个强大的工具,用于处理异步任务的结果和状态。