Java 8: CompletableFuture の決定的なガイドによると、CompletableFuture オブジェクトは 1 回しか完了できません。私がそれを発見したとき、私は単純なインターフェースを念頭に置いていました:
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()
。
どうやらそれはそのようには機能しません。このようなサイクルが最初に発生したときは問題なく動作しますが、2 回目は正常に動作します。まったく別のクラスでは待機せずcomplete()
、CompletableFuture クラスのメソッドは false を返します。
それで、一度しか完了できないので、新しいインスタンスを作成して「リセット」してみませんか?とにかく値を一度だけ使用します。それはうまくいきません。実際、それは完全に壊れます。新しいインスタンスを作成しようとすると、プログラムがデッドロック状態になります!
この記事では、未来を完成させずに価値を伝える方法についても触れています ( obtrudeValue()
)。これを試してみましたが、方法と同じ結果になりcomplete()
ます。
これを防ぐためにできること、または必要な機能を持つ代替手段はありますか?