2016-01-06 48 views
1

我要實現以下僞代碼說明了什麼:確定未來從回調

int functionA() { 
    Future res; 
    // ... 
    setCallbackForSomething(new Callback() { 
     public void onCall() { 
      // ... 
      res = 5; 
     } 
    }); 
    // ... 
    return doSomethingElse(res.get()); 
} 

即泛函塊,直至回調已被調用,然後處理結果並返回的東西。

是否可能與Future?通常的用法,

Future res = executor.submit(...); 
... 
res.get() 

似乎不工作在這裏。我也無法改變我必須像這樣設置回調的事實。

回答

3

Future具有有限的功能。來自javadoc

A Future表示異步計算的結果。提供方法 以檢查計算是否完成,等待其完成,並檢索計算結果。

它只公開讀取操作(cancel除外)。您將無法通過Future達到您想要的效果。

相反,自從Java 8中,您可以使用CompletableFuture

一個Future可以明確完成(其值設置和 狀態),並且可以作爲一個CompletionStage,支持依賴 功能和操作在完成時觸發。

您初始化CompletableFuture

CompletableFuture<Integer> res = new CompletableFuture<>(); 

,並完成它要麼normallyexceptionally

setCallbackForSomething(new Callback() { 
    public void onCall() { 
     // ... 
     res.complete(5); // or handle exception 
    } 
}); 

與其說get,你可以chain a completion taskCompletableFuture調用doSomethingElse

res.thenAccept(value -> doSomethingElse(value)); 

雖然你仍然可以調用get如果你想,阻塞,直到將來完成。


的Java 8之前,番石榴庫提供SettableFuture達到承諾值的「設置」部分。但它也是一個ListenableFuture,所以你可以完成其他操作。