0

根据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()方法相同。

我可以做些什么来防止这种情况或具有我想要的功能的替代方法吗?

4

0 回答 0