Future是在jdk1.5之后才加入進來,屬于java.util.concurrent.*框架中的一個接口.
Future接口定義了一個異步計算結果的規(guī)則.在Future類中的方法可以用來檢查計算是否完成, 等待計算完成, 取得計算結果. 結果只能通過方法get()來獲取, 他會阻塞等待計算結果;同時也可以取消一個異步計算任務,但是這個任務必須是要沒有開始執(zhí)行的.如果我們只想用Future來實現一個可以取消的任務而不是要獲取一個可用的計算結果,那么我們可以聲明為Future<?>,然后再get()方法中返回null.
Future的使用方式如下:
1. 直接使用Future,從ExecutorService中返回一個Future實例
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(); // do other things while searching
try {
displayText(future.get()); // use future
} catch (ExecutionException ex) { cleanup(); return; }
}
}
2. 使用FutureTask類,FutureTask是RunnableFuture接口的一個基本實現.
FutureTask<String> future =
new FutureTask<String>(new Callable<String>() {
public String call() {
return searcher.search(target);
}});
executor.execute(future);
方法定義
下面看看Future接口里面定義的方法, 他的具體實現將在FutureTask中分析
boolean cancel(boolean mayInterruptIfRunning);
取消一個異步計算任務
boolean isCancelled();
判斷任務是否被取消
boolean isDone();
判斷任務是否完成, 任務完成的狀態(tài)標志包括:正常結束, 出現異常, 被取消
V get() throws InterruptedException, ExecutionException;
獲取異步任務結果
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
在給定的時間范圍內獲取異步任務結果
RunnableFuture(V)繼承自Future和Runnable,使得Future是可執(zhí)行的.