- 类型参数:
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(); // do other things while searching
try {
displayText(future.get()); // use future
} catch (ExecutionException ex) { cleanup(); return; }
}
} FutureTask 类是实现 Runnable 的 Future 的实现,因此可以由 Executor 执行。例如,上面带有 submit 的结构可以替换为:
FutureTask<String> future = new FutureTask<>(task);
executor.execute(future);
内存一致性影响:异步计算采取的操作 发生在之前 在另一个线程中执行相应的 Future.get() 操作。
- 自从:
- 1.5
- 参见:
-
内部类总结
内部类 -
方法总结
-
方法详情
-
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 对象流并使用map操作获取结果流时。
results = futures.stream() .filter(f -> f.state() == Future.State.SUCCESS) .map(Future::resultNow) .toList();- 实现要求:
-
默认实现调用
isDone()来测试任务是否已完成。如果完成,它会调用get()来获取结果。 - 返回:
- 计算结果
- 抛出:
IllegalStateException- 如果任务尚未完成或任务未完成并有结果- 自从:
- 19
-
exceptionNow
返回任务抛出的异常,无需等待。此方法适用于调用者知道任务已完成但出现异常的情况。
- 实现要求:
-
默认实现调用
isDone()来测试任务是否已完成。如果完成且未取消,它会调用get()并捕获ExecutionException以获取异常。 - 返回:
- 任务抛出的异常
- 抛出:
IllegalStateException- 如果任务还没有完成,任务正常完成,或者任务被取消- 自从:
- 19
-
state
返回计算状态。- 实现要求:
-
默认实现使用
isDone()、isCancelled()和get()来确定状态。 - 返回:
- 计算状态
- 自从:
- 19
-