私は CompletableFutures について多くのことを読んできましたが、CompletableFuture は Future のように基礎となる計算コードにアクセスできないという事実に焦点を当てています。では、completableFuture が関連付けられている任意のタスク内から、どうすれば complete() または cancel() を通知できますか (または、外部から計算を中断したい場合は isCancelled() を確認します)。
編集:私を混乱させることの1つは、CFが構成可能性または手動設定可能性のいずれかの代替手段よりも使用されていることです。
CompletableFuture.runAsync(() -> {
if(myCondition) CF_REF?.complete();
else CF_REF?.exceptionally();
}).thenApply(() -> {
if (myOtherCondition) CF_REF_2?.complete();
(...)
同時に「完成可能」+「構成可能」ではない方法で設計するポイントは何ですか?
CF が架空の CompletableCallable に似たインターフェイスを入力として使用したかのようにそれらを使用する方法を見つけたいのですが、方法がわかりません。Callables/Runnables の代わりのようなものなFunction<CompletableFuture,T>
ので、次のように使用できます。
CompletableFuture CF_REF_BIS = CompletableFuture.runAsync((CF_REF) -> {
if(myCondition) CF_REF.complete();
else CF_REF.exceptionally();
});
CF_REF_BIS.thenApply(...)
コードが計算されるとき、まさに CF_REF_BIS 参照が、スコープ全体でアクセスする必要なく、将来の計算で実際に CF_REF として渡されるものとして、内部実行メカニズムによって返されます。
つまり、新しい CompeltableCallable() を作成し、任意のスレッドが CompletableFuture セマフォにアクセスできる任意の場所に n 回送信するだけで、計算コードを非匿名化して再利用できることを意味します。
例えば:
CompletableFuture CF_REF = CompletableFuture.runAsync(myCompletableCallable)
.thenApply(myCompletableCallable) //again
.thenApply(anotherCompletableCallable);
その必要性を達成する方法はありますか?私は何かを忘れていますか?私のアプローチに根本的な矛盾はありますか? Java CompletableFuture はまだ中途半端な便利な設計ですか?