問題タブ [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 - Java 8 の完了可能な未来をキャンセルするには?
私は Java 8 の完了可能な先物で遊んでいます。次のコードがあります。
runAsync を使用して、ラッチを待機するコードの実行をスケジュールします。次に、中断された例外が内部でスローされることを期待して、未来をキャンセルします。しかし、スレッドは await 呼び出しでブロックされたままのようであり、将来がキャンセルされても (アサーションが渡されます)、InterruptedException がスローされることはありません。ExecutorService を使用した同等のコードは、期待どおりに機能します。CompletableFuture または私の例のバグですか?
java - thenComposeAsync がリターンが償還可能になるのを待つのはなぜですか
私は不自然なコード例を書き上げました。誰かが使うべきコードではないかもしれませんが、うまくいくはずだと私は信じています。ただし、代わりにデッドロックします。hereで説明されている回答を読みましたが、不十分であることがわかりました。
コード例は次のとおりです。
これは以下を出力します:
タスクをエンキューしようとしています
キューに入れられたタスク
そして、ハングします。Executor にはスレッドが 1 つしかなく、innerFuture が償還可能になるのを待っているため、デッドロック状態です。「thenComposeAsync」は、まだ不完全な未来を返し、エグゼキュータでそのスレッドを解放するのではなく、戻り値が償還可能になるのをブロックするのはなぜですか?
これは完全に直観的ではなく、javadocs はあまり役に立ちません。CompletionStages の仕組みを根本的に誤解していますか? それとも、これは実装のバグですか?
multithreading - Java 8 CompletedFuture Web クローラーが 1 つの URL を超えてクロールしない
Cay S. Horstmann 著「Java SE 8 for the Really Impatient」という本から演習を行いながら、Java 8 で新しく導入された同時実行機能を試しています。新しいCompletedFutureとjsoupを使用して、次の Web クローラーを作成しました。基本的な考え方は、URL が与えられると、そのページの最初の m 個のURL を見つけて、このプロセスをn回繰り返します。もちろん、 mとnはパラメータです。問題は、プログラムが最初のページの URL をフェッチするが、再帰しないことです。私は何が欠けていますか?
テストケース:
multithreading - Java 8 CompletedFuture と ThreadLocalRandom
私は、Cay S. Horstmann 著の本「本当にせっかちな人のための Java SE 8」の演習に取り組んでいます。
メソッドを書く
これは、関数によって受け入れられる値が生成されるまでアクションを非同期的に繰り返し
until
ます。これも非同期で実行する必要があります。コンソールからa を読み取る関数とjava.net.PasswordAuthentication
、1 秒間スリープしてからパスワードが「秘密」であることを確認することで有効性チェックをシミュレートする関数を使用してテストします。
次のコードを思いつきましたが、ランダムなパスワード生成戦略が失敗しているようです。すべてのスレッドが常に同じパスワードを選択しますが、これは非常に奇妙に思えます。
テストケース:
1 回実行して、同じパスワードがどれだけ奇妙に選択されるかを確認します。
2015-01-09 15:41:33.350 [スレッド 1] [情報] najjcPracticeQuestionsCh6Test - 受信したパスワード: secretPassword。2015-01-09 15:41:34.371 [スレッド 3] [情報] najjcPracticeQuestionsCh6Test - 受信したパスワード: secretPassword。2015-01-09 15:41:35.442 [スレッド 5] [情報] najjcPracticeQuestionsCh6Test - 受信したパスワード: secretPassword。2015-01-09 15:41:36.443 [スレッド 7] [情報] najjcPracticeQuestionsCh6Test - 受信したパスワード: secretPassword。2015-01-09 15:41:37.451 [スレッド 9] [情報] najjcPracticeQuestionsCh6Test - 受信したパスワード: secretPassword。
java - Java 8 の完全な未来
私の問題は、Completable Future の使い方です。
Callable を実装するクラスがあります。
以前は行うために使用されます-
を返しますFuture<Collection>
。ただし、 future はもう使用したくないので、 が必要CompletableFuture
です。1 つのアイデアは、CompletableFuture でポーリングする必要がなく、準備が整うまで待機してブロックする必要がないということです。
では、どうすれば完了可能な未来を使用し、スレッドが終了isDone()
したときに関数を呼び出すことができますか。callable