2016-02-26 91 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