根据Java 8: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()
。
显然它不是那样工作的。第一次发生这样的循环它工作正常但是第二次; 在完全不同的类上,它不会等待,并且complete()
CompletableFuture 类的方法返回 false。
所以我想,好吧,它只能完成一次,那为什么不创建一个新实例来“重置”它呢?无论如何,我只使用一次该值。那是行不通的。事实上,它完全崩溃了。当我尝试创建一个新实例时,我的程序会陷入死锁!
这篇文章还谈到了一种在不完成未来的情况下传递价值的方法(obtrudeValue()
)。我试过这个,但结果与complete()
方法相同。
我可以做些什么来防止这种情况或具有我想要的功能的替代方法吗?