Future源码解读
〇、[源码版本] jdk 1.8
一、Future概述
Future
表示异步计算的结果。提供了检查计算是否完成、等待计算完成以及检索计算结果的方法。
结果只能在计算完成后使用方法get取回,必要时阻塞,直到它准备好。
取消由cancel
方法执行。
提供了其他方法来确定任务是正常完成还是被取消。计算一旦完成,就不能取消计算。
如果您想使用Future
来实现可取消性,但不提供可用结果,您可以声明Future<?>
形式的类型并返回null
作为基础任务的结果。
[举例1]示例代码
interface ArchiveSearcher { String search(String target); }
class App {
ExecutorService executor = ...
ArchiveSearcher searcher = ...
void showSearch(final String target) throws InterruptedException {
Future<String> future = executor.submit(new Callable<String>() {
public String call() {
return searcher.search(target);
}
});
displayOtherThings(); // 在处理search的时候,异步处理其他事
try {
displayText(future.get()); // 使用future
} catch (ExecutionException ex) {
cleanup(); return;
}
}
}
FutureTask
类是Future
的实现,它实现了Runnable
,因此可以由Executor
执行。例如,上面带有submit
的构造可以替换为:
[举例2]示例代码
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
public String call() {
return searcher.search(target);
}});
executor.execute(future);
内存一致性影响
异步计算采取的动作,内存可见性发生在另一个线程中对应Future.get()
的操作之前。
二、Future接口的方法
cancel方法
boolean cancel(boolean mayInterruptIfRunning);
尝试取消此任务的执行。
如果任务已完成、已被取消、或由于某些其他原因无法取消,则此尝试将失败。
如果成功,并且在调用cancel
时此任务尚未启动,此任务不应运行。
如果任务已经开始,那么mayInterruptIfRunning
参数确定执行此任务的线程是否应该在尝试停止任务时被中断。
a.参数:
mayInterruptIfRunning
执行此任务的线程是否应该被中断;否则,允许进行中的任务完成
b.返回:
true
任务取消执行
false
如果任务无法取消,通常是因为它已经正常完成
c.异常:无
isCancelled方法
boolean isCancelled();
如果此任务在正常完成之前被取消,则返回true
。
a.参数:无
b.返回:
true
如果此任务在正常完成之前被取消
c.异常:无
isDone方法
boolean isDone();
如果此任务完成,则返回true
。完成可能是由于正常终止、异常或取消——在所有这些情况下,此方法将返回true
。
a.参数:无
b.返回:
true
如果此任务完成
c.异常:无
get方法
V get() throws InterruptedException, ExecutionException;
如有必要,等待计算完成,然后取回其结果。
a.参数:无
b.返回:
V
计算结果
c.异常:
throws CancellationException
如果计算被取消
throws ExecutionException
如果计算抛出异常
throws InterruptedException
如果当前线程在等待时被中断
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
如有必要,最多等待给定的计算时间完成,然后取回其结果(如果可用)。
a.参数:
timeout
最长等待时间
unit
超时参数timeout
的时间单位
b.返回:
V
计算结果
c.异常:
throws CancellationException
如果计算被取消
throws ExecutionException
如果计算抛出异常
throws InterruptedException
如果当前线程在等待时被中断
throws TimeoutException
如果等待超时