- 类型参数:
-
V- 由此Future的get方法返回的结果类型
- 所有已知的子接口:
-
RunnableFuture<V>,RunnableScheduledFuture<V>,ScheduledFuture<V>
- 所有已知的实现类:
-
CompletableFuture,CountedCompleter,ForkJoinTask,FutureTask,RecursiveAction,RecursiveTask,SwingWorker
public interface Future<V>
Future表示异步计算的结果。提供了方法来检查计算是否完成,等待其完成,并检索计算的结果。只有在计算完成时才能使用get方法检索结果,必要时会阻塞直到准备就绪。通过cancel方法执行取消操作。还提供了其他方法来确定任务是否正常完成或已取消。一旦计算完成,就无法取消计算。如果想要使用Future来实现可取消性但不提供可用结果,可以声明形式为Future<?>的类型,并将null作为基础任务的结果返回。
示例用法(请注意,以下类都是虚构的。)
interface ArchiveSearcher { String search(String target); }
class App {
ExecutorService executor = ...;
ArchiveSearcher searcher = ...;
void showSearch(String target) throws InterruptedException {
Callable<String> task = () -> searcher.search(target);
Future<String> future = executor.submit(task);
displayOtherThings(); // 在搜索时执行其他操作
try {
displayText(future.get()); // 使用future
} catch (ExecutionException ex) { cleanup(); return; }
}
}FutureTask类是Future的实现,实现了Runnable,因此可以由Executor执行。例如,可以用execute替换上述使用submit的构造方式:
FutureTask<String> future = new FutureTask<>(task);
executor.execute(future);
内存一致性效果: 异步计算采取的操作在另一个线程中对应的Future.get()之后发生。
- 自 JDK 版本:
- 1.5
- 参见:
-
Nested Class Summary
Nested Classes -
Method Summary
Modifier and TypeMethodDescriptionbooleancancel(boolean mayInterruptIfRunning) 尝试取消执行此任务。default Throwable返回任务抛出的异常,无需等待。get()等待计算完成,然后检索其结果。必要时等待最多指定时间以完成计算,然后检索其结果(如果可用)。boolean如果此任务在正常完成之前被取消,则返回true。booleanisDone()如果此任务已完成,则返回true。default V返回计算的结果,无需等待。default Future.Statestate()返回计算状态。
-
Method Details
-
cancel
boolean cancel(boolean mayInterruptIfRunning) 尝试取消执行此任务。如果任务已完成或已取消,或由于其他原因无法取消,则此方法不起作用。否则,如果调用cancel时任务尚未启动,则此任务不应运行。如果任务已经启动,则mayInterruptIfRunning参数确定是否中断执行此任务的线程(如果实现已知)以尝试停止任务。此方法的返回值不一定表示任务现在是否已取消;请使用
isCancelled()。- 参数:
-
mayInterruptIfRunning- 如果应中断执行此任务的线程(如果实现已知),则为true;否则,允许正在进行的任务完成 - 返回:
-
如果任务无法取消(通常是因为已经完成),则返回
false;否则返回true。如果两个或更多线程导致任务被取消,则至少有一个线程返回true。实现可能提供更强的保证。
-
isCancelled
boolean isCancelled()如果此任务在正常完成之前被取消,则返回true。- 返回:
-
如果此任务在完成之前被取消,则返回
true
-
isDone
boolean isDone()如果此任务已完成,则返回true。完成可能是由于正常终止、异常或取消 -- 在所有这些情况下,此方法将返回true。- 返回:
-
如果此任务已完成,则返回
true
-
get
等待计算完成,然后检索其结果。- 返回:
- 计算的结果
- 抛出:
-
CancellationException- 如果计算被取消 -
ExecutionException- 如果计算抛出异常 -
InterruptedException- 如果当前线程在等待时被中断
-
get
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 必要时等待最多指定时间以完成计算,然后检索其结果(如果可用)。- 参数:
-
timeout- 等待的最长时间 -
unit- 超时参数的时间单位 - 返回:
- 计算的结果
- 抛出:
-
CancellationException- 如果计算被取消 -
ExecutionException- 如果计算抛出异常 -
InterruptedException- 如果当前线程在等待时被中断 -
TimeoutException- 如果等待超时
-
resultNow
返回计算的结果,无需等待。此方法适用于调用者知道任务已成功完成的情况,例如在过滤一系列Future对象以获取成功任务并使用映射操作获取结果流的情况。
results = futures.stream() .filter(f -> f.state() == Future.State.SUCCESS) .map(Future::resultNow) .toList();- 实现要求:
-
默认实现调用
isDone()来测试任务是否已完成。如果已完成,则调用get()来获取结果。 - 返回:
- 计算的结果
- 抛出:
-
IllegalStateException- 如果任务尚未完成或任务未完成且没有结果 - 自 JDK 版本:
- 19
-
exceptionNow
返回任务抛出的异常,无需等待。此方法适用于调用者知道任务已经以异常完成的情况。
- 实现要求:
-
默认实现调用
isDone()来测试任务是否已完成。如果已完成且未取消,则调用get()并捕获ExecutionException来获取异常。 - 返回:
- 任务抛出的异常
- 抛出:
-
IllegalStateException- 如果任务尚未完成,任务已正常完成,或任务已取消 - 自 JDK 版本:
- 19
-
state
返回计算状态。- 实现要求:
-
默认实现使用
isDone()、isCancelled()和get()来确定状态。 - 返回:
- 计算状态
- 自 JDK 版本:
- 19
-