类介绍
- 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 searchingtry {displayText(future.get()); // use future} catch (ExecutionException ex) { cleanup(); return; }}
}}
- “FutureTask 类是 Future 的一个实现,它实现了 Runnable 接口,因此可以由 Executor 执行。例如,上述使用 submit 的构造可以替换为:”
FutureTask<String> future = new FutureTask<>(task);
executor. execute(future);
public interface Future<V> {/*** “尝试取消此任务的执行。如果任务已经完成或已被取消,或者由于其他原因无法取消,则此方法无效。* 否则,如果在调用 cancel 时任务尚未开始,则该任务不应运行。* 如果任务已经开始,那么 mayInterruptIfRunning 参数决定了执行此任务的线程(如果实现知道该线程)是否会中断,* 以尝试停止任务。* * 该方法的返回值不一定表示任务现在是否已取消;应使用 isCancelled 方法来判断。** @param mayInterruptIfRunning 如果执行此任务的线程(如果实现知道该线程)应该被中断,则为 true;* 否则,允许正在进行的任务完成。* @return 如果任务无法取消(通常是因为它已经完成),则返回 false;否则返回 true。* 如果有两个或多个线程导致任务被取消,则至少有一个线程返回 true。实现可能提供更强的保证。”*/boolean cancel(boolean mayInterruptIfRunning);/*** 任务在正常结束之前被取消就返回true*/boolean isCancelled();/*** 任务完成(正常完成,异常,或者取消)就返回true*/boolean isDone();/*** 等到计算结束,然后查询结算结果* @return 计算结果* @throws 计算被取消,抛出 CancellationException * @throws 计算本身抛出了异常 ExecutionException* @throws 当前线程终端,抛出InterruptedException*/V get() throws InterruptedException, ExecutionException;/*** 等待指定的时间,然后查询结算结果(如果结果可用)* * @param 最大等待时长* @param 最大等待时长的单位* @return 计算结果* @throws 计算被取消,抛出 CancellationException * @throws 计算本身抛出了异常 ExecutionException* @throws当前线程终端,抛出InterruptedException* @throws 等待超时,抛出TimeoutException*/V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
}