天天看點

JAVA并發-Future

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