- 类型参数:
-
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
-
Method Summary
Modifier and TypeMethodDescriptionboolean
cancel
(boolean mayInterruptIfRunning) 尝试取消执行此任务。default Throwable
返回任务抛出的异常,无需等待。get()
等待计算完成,然后检索其结果。必要时等待最多指定时间以完成计算,然后检索其结果(如果可用)。boolean
如果此任务在正常完成之前被取消,则返回true
。boolean
isDone()
如果此任务已完成,则返回true
。default V
返回计算的结果,无需等待。default Future.State
state()
返回计算状态。
-
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
-