java.util.concurrent.Future 介面 原始碼
執行緒池相關
原始碼:
package java.util.concurrent; public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
介面 Future<V>
型別引數:
V
- 此 Future 的 get 方法所返回的結果型別
所有已知子介面:
Response<T>, RunnableFuture<V>, RunnableScheduledFuture
所有已知實現類:
Future 表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並獲取計算的結果。
計算完成後只能使用 get 方法來獲取結果,如有必要,計算完成前可以阻塞此方法。取消則由 cancel 方法來執行。還提供了其他方法,以確定任務是正常完成還是被取消了。
一旦計算完成,就不能再取消計算。如果為了可取消性而使用 Future 但又不提供可用的結果,則可以宣告 Future<?> 形式型別、並返回 null 作為底層任務的結果。
用法示例(注意,下列各類都是構造好的。)
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; }
}
}
FutureTask
類是 Future 的一個實現, Future 可實現 Runnable,所以可通過 Executor 來執行。例如,可用下列內容替換上面帶有 submit 的構造:
FutureTask<String> future =
new FutureTask<String>(new Callable<String>() {
public String call() {
return searcher.search(target);
}});
executor.execute(future);
方法摘要
boolean |
cancel(boolean mayInterruptIfRunning) 試圖取消對此任務的執行。 |
V |
get() 如有必要,等待計算完成,然後獲取其結果。 |
V |
get(long timeout, TimeUnit unit) 如有必要,最多等待為使計算完成所給定的時間之後,獲取其結果(如果結果可用)。 |
boolean |
isCancelled() 如果在任務正常完成前將其取消,則返回 true。 |
boolean |
isDone() 如果任務已完成,則返回 true。 |
cancel
boolean cancel(boolean mayInterruptIfRunning)
試圖取消對此任務的執行。如果任務已完成、或已取消,或者由於某些其他原因而無法取消,則此嘗試將失敗。當呼叫 cancel 時,如果呼叫成功,而此任務尚未啟動,則此任務將永不執行。如果任務已經啟動,則 mayInterruptIfRunning 引數確定是否應該以試圖停止任務的方式來中斷執行此任務的執行緒。
此方法返回後,對 isDone()
的後續呼叫將始終返回 true。如果此方法返回 true,則對 isCancelled()
的後續呼叫將始終返回 true。
引數:
mayInterruptIfRunning
- 如果應該中斷執行此任務的執行緒,則為 true;否則允許正在執行的任務執行完成
返回:
如果無法取消任務,則返回 false,這通常是由於它已經正常完成;否則返回 true
isCancelled
boolean isCancelled()
如果在任務正常完成前將其取消,則返回 true。
返回:
如果任務完成前將其取消,則返回 true
isDone
boolean isDone()
如果任務已完成,則返回 true。 可能由於正常終止、異常或取消而完成,在所有這些情況中,此方法都將返回 true。
返回:
如果任務已完成,則返回 true
get
V get() throws InterruptedException, ExecutionException
如有必要,等待計算完成,然後獲取其結果。
返回:
計算的結果
丟擲:
CancellationException
- 如果計算被取消
ExecutionException
- 如果計算丟擲異常
InterruptedException
- 如果當前的執行緒在等待時被中斷
get
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
如有必要,最多等待為使計算完成所給定的時間之後,獲取其結果(如果結果可用)。
引數:
timeout
- 等待的最大時間
unit
- timeout 引數的時間單位
返回:
計算的結果
丟擲:
CancellationException
- 如果計算被取消
ExecutionException
- 如果計算丟擲異常
InterruptedException
- 如果當前的執行緒在等待時被中斷
TimeoutException
- 如果等待超時