java.util.concurrent.Future
, 代表着通過異步計算傳回結果,建立異步任務時,傳回一個java Future對象。異步任務完成後,可以通過啟動任務時傳回的Future對象通路結果,一些Java的内置并發實用程式,比如ExecutorService,從它們的一些方法傳回一個java Future對象。在
ExecutorService
中,當送出一個Callable以便并發(異步)執行時,它傳回一個Future
。
Future接口定義
為了了解
Future
接口如何工作, 下面是接口的定義:
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning)
V get();
V get(long timeout, TimeUnit unit);
boolean isCancelled();
boolean isDone();
}
每一個方法下都會講到,但是正如你所見,
Future
并沒有那麼進階。
從Future擷取結果
前面講到,
Future
代表了可以擷取結果的異步任務。
擷取結果,可以通過
Future
兩個
get()
方法中的一個,get()方法都可以傳回結果,但是傳回的結果也是泛型(就是指定類的對象,而不僅僅是Object)
。下面是通過
Future
的get()方法擷取傳回結果:
Future future = ... // get Future by starting async task
// do something else, until ready to check result via Future
// get result from Future
try {
Object result = future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
如果在異步任務沒完成之前調用get()方法将阻塞直到任務完成才傳回結果。可以調用帶有時間參數的get()方法,當逾時了會抛異常,看下例子:
try {
Object result =
future.get(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
// thrown if timeout time interval passes
// before a result is available.
}
上面的示例最多等待1000毫秒,可以獲得結果,如果1000毫秒内沒有結果傳回,将抛
TimeoutException
。
通過Future的cancel()取消任務
可以通過
Future
執行個體的
cancel()
方法取消異步任務,
異步任務的實作必須支援取消任務,如果不支援,調用
cancel()
方法沒有任何作用:
future.cancel();
檢查任務是否完成
可以通過調用
Future
的
isDone()
檢查異步任務是否完成:
Future future = ... // Get Future from somewhere
if(future.isDone()) {
Object result = future.get();
} else {
// do something else
}
檢查任務是否取消
同樣可以通過調用
Future
的
isCancelled()
方法檢查異步任務是否已經取消
:
Future future = ... // get Future from somewhere
if(future.isCancelled()) {
} else {
}
參考:http://tutorials.jenkov.com/java-util-concurrent/java-future.html
https://blog.csdn.net/cgsyck/article/details/107692471
https://blog.csdn.net/cgsyck/article/details/107709421