問題タブ [completable-future]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - CompletableFuture で意図的にスタックを吹き飛ばしても、スタック オーバーフローは発生しませんか?
CompletableFuture で故意にスタック オーバーフローを引き起こした場合の動作を確認しようとしていますが、代わりに成功し、再帰ループが停止して終了し、junit テストに合格したことがわかりました。これは、私が望む動作ではありません。私は自分のコードを修正することを知っているので、フェイルファーストの動作が必要です。
カウント1455前後でEclipseでデバッグしようとしましたが、Eclipseがフリーズしてスタックトレースをロードできないため、この動作の背後にある理由を見つけることができませんでした。
だから私の質問は簡単です
- 私のコードは何らかの形で間違っていますか?
- CompletableFuture はどのように正常に終了しますか (または、おそらくそうではない場合、junit テスト ケースがどのように合格するか)。
たぶんOSが重要です...私はMacを使用しています。私は以前、独自に開発した約束を持っていましたが、それらはスタックをうまく吹き飛ばしました。
java - 直線的な可読性を維持しながらスレッドに委譲する
中断された可能性のある状態を維持しながら、結果が切断されたブロッキング メソッドを処理するさまざまな方法を試してきました。送信と受信を調整するのが難しい、異種のクラスとメソッドを処理しなければならないことにイライラすることがわかりました。
次の例では、SomeBlockingMethod()
通常void
、メッセージが他のプロセスに送信されると戻ります。しかし、代わりにsynchronized
、結果を受け取るリスナーで作成しました。スレッドにスピンオフするwait()
ことで、タイムアウトまたは無期限で結果を得ることができます。
結果が返されると、スレッド化されたタスクの結果を待っている間に一時停止しなければならなかった特定の状態で作業を続けることができるので、これは素晴らしいことです。
これは私のアプローチに何か問題がありますか?
この質問は一般的なように思えるかもしれませんが、 Javaでのスレッド化に関するアドバイスを特に探しています。
疑似コードの例:
CompletableFuture で更新:
またはさらに良い:
厳密に使用する場合の問題CompletableFuture
は、それCompletableFuture.thenAccept
がグローバル スレッド プールから実行され、呼び出しスレッドとの同期が保証されないことです。
同期タスクにスケジューラを追加すると、これが修正されます。
完全なスケジューラ メソッドと比較して使用する場合の注意点は、CompletableFuture
外部に存在する以前の状態は最終的または実質的に最終的でなければならないということです。
java - ブロックせずに CompletableFuture を開始し、完了したら何かを行うにはどうすればよいですか?
API はかなり威圧的で、多くのCompletableFuture
受け入れ、そしてその他のものです。さまざまなオプションが存在する理由を説明するのは困難です。
私は基本的に a を模倣しようとしてnew Thread(() -> dostuff).start()
いますが、より優れたスレッド プーリング、エラー処理などを使用しています。注: 実際にはRunnable
ここでインターフェイスは必要ありません。既存のコードの一部を生成しています。
非同期タスクを開始し、完了時に動作を実行する正しい方法は何ですか? またはスローされた例外を処理しますか?
java - CompletableFuture の分離された例外処理
私たちの API のコンシューマが例外を処理する必要がないようにしたいことはわかっています。または、より明確に、例外が常にログに記録されるようにしたいのですが、成功を処理する方法を知っているのは消費者だけです。クライアントが必要に応じて例外を処理できるようにしたいのですが、クライアントにFile
返すことができる有効なものはありません。
注:FileDownload
はSupplier<File>
内容がよくわかりませんCompletionStage
。またはを使用しますexception
かhandle
?元の未来を返すか、それとも彼らが返す未来を返すか?
java - あるタイプの CompletableFuture を別のタイプに変換するにはどうすればよいですか?
現在、以下に示すように変換CompletableFuture<X>
してCompletableFuture<Void>
いますが、もっと良い方法があるかどうか疑問に思っていました。
java - ExecutorService に渡すことができ、Runnables 間の依存関係を持つオブジェクト
依存関係を持つオブジェクトを作成しようとしています。つまり、ExecutorService を持つクラスと、Runnables を生成するクラスは異なります。簡単な抽象化は次のとおりです。
これらのクラスが 1 つの場合、以前は CompletableFuture を使用していました。
しかし、今pool
は別のクラスに存在します。CompletableFuture クラスのドキュメントをもっと見ていますが、それが役立つかどうかはまだわかりません。
この辺に詳しい人いませんか?
java - CompletableFuture 連鎖の結果
メソッドの呼び出し/結果を次の呼び出しにチェーンしようとしています。前の呼び出しから objB の参照を取得できない場合、コンパイル時エラー methodE が発生します。
前の呼び出しの結果を次のチェーンに渡すにはどうすればよいですか? プロセスを完全に誤解していませんか?
asynchronous - CompletableFuture を変換するにはどうすればよいですか> ストリームへブロックせずに
Async Http Client ライブラリ(Nettyを使用) を使用して、RESTful API への非同期 Http Get リクエストを作成しています。非ブロッキング動作を維持したいのでCompletableFuture<T>
、Http Get リクエストの結果として のインスタンスを返します。したがって、RESTful API エンドポイントが Json 配列を返す場合、私はCompletableFuture<T[]>
.
それでも、Erik Meijer によるThe Four Essential Effects In Programmingに関する分類によればStream<T>
、非同期の Http Get リクエストを作成して Json 配列を返す Java メソッドの結果により適していると考えています。この場合、を同等のものStream<T>
として見ることができます。これは、多くの値を返す非同期計算の結果です。Observable<T>
したがって、それresp
が応答を保持していると考えるとCompletableFuture<Stream<T>>
、次のように取得できます。
CompletableFuture<Stream<T>> resp
ただし、計算が完了するのを待たずに を に変換するにはどうすればよいでしょうか(つまり、呼び出しStream<T>
時にブロックしたくありません)。get()
私は次の式と同じ結果を得たいと思っていますが、 on をブロックすることはありませんget()
: