2016-02-26 45 views
-1

當我如下實施CompletableFuture但得到一個錯誤說錯誤說 「CompletableFuture(對象)在CompletableFuture私有訪問」 實施CompletableFuture

CompletableFuture(Object)CompletableFuture

public CompletableFuture<A> init(B b) { 

    C c = new C(); 
    CompletableFuture<A> future = new CompletableFuture<A>(c); 

    return future; 
} 

public class C implements Callable<A> { 

    public A call() throws Exception { 
     A a = new A(); 
     return a; 
    } 
} 
私接

我希望解決方案來克服這個錯誤?

+1

你究竟在做什麼? – Tunaki

+1

「CompletableFuture(Object)的哪一部分具有私人訪問權限」你不明白嗎? 'private'意味着構造函數不會被其他類使用。這包括你的班級。除了訪問問題,什麼讓你思考,你可以傳遞一個'Callable'給構造函數並獲得一個有用的行爲?你在混合'CompletableFuture'和'FutureTask'嗎? – Holger

+0

@Holger - 我已經成功實現了'FutureTask',現在試圖實現'CompletableFuture',因爲我想異步工作。 – Malinda

回答

1

CompletableFuture類中沒有公共構造函數,它接受一個參數。這是更好地使用CompletableFuture.supplyAsync()這需要靜態方法的Supplier代替Callable

CompletableFuture<A> future = CompletableFuture.supplyAsync(A::new); 

或者使用lambda:

CompletableFuture<A> future = CompletableFuture.supplyAsync(() -> new A()); 

注意,如果A構造函數拋出checked異常,你應該Supplier接口做處理它不支持例外情況:

CompletableFuture<A> future = CompletableFuture.supplyAsync(() -> { 
    try { return new A(); } 
    catch(Exception ex) { throw new RuntimeException(ex);} 
}); 

最後說明那supplyAsync不僅會創建CompletableFuture,還會安排它在公共線程池中執行。您可以指定自定義Executor作爲supplyAsync方法的第二個參數。如果你想創建CompletableFuture而不發送它執行,那麼可能你不需要CompletableFuture

+0

謝謝你的解釋。我可能錯過了這個概念。我還有一個問題。那是不是意味着,沒有必要從「Callable」延伸出一個類?在我的代碼中,這是一個耗時的任務。根據你的解釋,這個任務應該在'try catch'塊中完成?如果那我應該在哪裏「完成」未來? – Malinda

+0

@Malinda,是的,在try-catch塊。你可以創建新的類(實現'Supplier',而不是'Callable'),但是對於簡單的函數來說,寫入lambda會更容易。爲了完成未來,只需從lambda返回值(或者如果您創建新類,則返回'Supplier.get'方法)。 –

+0

我成功實現了這一點。感謝您的幫助。 – Malinda

相關問題