根据Java 8: Definitive guide to CompletableFuture,CompletableFuture对象只能完成一次。当我发现它时,我有一个简单的界面:
public interface Synchronizable<E> {
CompletableFuture future = new CompletableFuture();
default E waitFor() throws InterruptedException, ExecutionException {
return (E) future.get();
}
default E waitFor(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
return (E) future.get(timeout, unit);
}
default void complete(E o) {
future.complete(o);
}
default void complete() {
complete(null);
}
}
为了让线程能够调用waitFor()
,它会等到另一个线程调用complete()
。
显然它不起作用。第一次这样的循环发生时,第二次正常工作;在一个完全不同的类上,它不会等待,并且CompletableFuture类的complete()
方法返回false。
所以我想,好吧它只能完成一次所以为什么不创建一个新的实例来“重置”呢?我只会使用一次该值。这不起作用。事实上,它完全打破了。当我尝试创建一个新实例时,我的程序陷入死锁!
本文还讨论了在不完成未来的情况下传递值的方法(obtrudeValue()
)。我尝试了这个,但结果与complete()
方法相同。
我能做些什么来防止这种情况或替代方案具有我想要的功能吗?