問題タブ [forkjoinpool]
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 - シングルスレッドの ForkJoinPool を構成するには?
ForkJoinPool
1つの実行スレッドを使用するように構成することはできますか?
Random
内で呼び出すコードを実行していますForkJoinPool
。実行するたびに実行時の動作が異なり、リグレッションの調査が難しくなります。
コードベースが「デバッグ」モードと「リリース」モードを提供することを望みます。「デバッグ」モードはRandom
、固定シードとForkJoinPool
単一の実行スレッドで構成されます。「リリース」モードでは、システム提供Random
のシードが使用され、デフォルトのForkJoinPool
スレッド数が使用されます。
ForkJoinPool
並列度 1 で構成しようとしましたが、2 つmain
のスレッド (および 2 つ目のワーカー スレッド) を使用します。何か案は?
java - Java7 ForkJoinTask では、しきい値のどの数が優れているか
私は Java ForkJoin フレームワークを試していて、大量のデータ リストを処理するプログラムを作成しました。
データ リストのパーティションの最小数を示すために、フィールドのしきい値が常に ForkJoinTask に設定されることはよく知られています。
問題は、しきい値をどの程度大きくまたは小さくするとパフォーマンスが向上するか、または柔軟性があり、CPU またはスレッドのサポートのコア数にのみ関連するかということです。
Forkjointask などの並列計算フレームワークでのしきい値のベスト プラクティスはありますか?
java - Java: 終了したスレッドを取得して、実行中のスレッドからタスクをピックアップする方法
実行時間が変化するタスクを含むマルチスレッド アプリケーションに取り組んでいます。1 つのスレッドが終了したときに、まだ実行中のスレッドからいくつかのタスクを引き継ぐ方法はありますか?
ここに例があります。私は 5 つのスレッドでプログラムを開始し、それぞれに 50 のタスクがあります。最も速く実行されているスレッドが終了しても、別のスレッドにはまだ 40 個のタスクが残っています。実行中のスレッドが残りの 40 を完了するのを待つのではなく、終了したスレッドが他のスレッドから 20 個のタスクを取得して、それぞれが 20 個の作業を続行できるようにするにはどうすればよいですか?
java - forkjoin の継続によるスレッドローカルの破損を回避する方法
この質問は、ThreadLocal の使用方法に関するものではありません。私の質問は、ThreadLocal コントラクトを破る ForkJoinTask.compute() の ForkJoinPool 継続の副作用についてです。
でForkJoinTask.compute()
、任意の静的 ThreadLocal をプルします。
値は任意のステートフル オブジェクトですが、compute()
呼び出しの終了後はステートフルではありません。つまり、スレッドローカルのオブジェクト/状態を準備し、それを使用してから破棄します。
原則として、その状態を ForkJoinTasK に入れますが、このスレッド ローカル値がサード パーティのライブラリにあると仮定して、変更することはできません。したがって、静的スレッドローカルは、すべてのタスク インスタンスが共有するリソースであるためです。
もちろん、単純な ThreadLocal は一度だけ初期化されることを予想し、テストし、証明しました。これは、ForkJoinTask.join()
呼び出しの下でのスレッドの継続により、compute()
メソッドが終了する前に再度呼び出される可能性があることを意味します。これにより、以前の計算呼び出しで使用されていたオブジェクトの状態が明らかになり、多くのスタックフレームが高くなります。
その望ましくない露出の問題をどのように解決しますか?
私が現在見ている唯一の方法は、呼び出しごとに新しいスレッドを確保することですcompute()
が、それは F/J プールの継続を無効にし、危険なほどスレッド数を爆発させる可能性があります。
最初の ForkJoinTask 以降に変更された TL をバックアップし、すべての task.compute がスレッドで最初に実行されるかのようにスレッドローカル マップ全体を元に戻すために、JRE コアで何かすることはありませんか?
ありがとう。
java - 並列ストリームでシーケンシャルを呼び出すと、以前のすべての操作がシーケンシャルになります
私は大量のデータを持っており、遅いがクリーンなメソッドを呼び出し、最初のメソッドの結果に副作用のある高速メソッドを呼び出したいと考えています。私は中間結果には興味がないので、それらを収集しないようにしたいと思います。
明らかな解決策は、並列ストリームを作成し、遅い呼び出しを行い、ストリームを再び順次にし、高速呼び出しを行うことです。問題は、すべてのコードがシングル スレッドで実行され、実際の並列処理がないことです。
コード例:
を削除するsequential
と、コードは期待どおりに実行されますが、明らかに、複数のスレッドで非並列操作が呼び出されます。
そのような動作に関する参考文献や、一時的なコレクションを回避する方法をお勧めできますか?
java - forkjoinpool は非再帰的なタスクを実行し、すべてを結合します
配列に格納されたオブジェクトのリストがあり、それぞれが計算する単純な (再帰的ではない) タスクを持っています。
各オブジェクトのこれらのメソッドを並行して実行し、すべてが終了するのを待ってから続行したいと考えています。
以下のコードが私が望むことを行うかどうかを知ることができますか? 私が見落としている問題はありますか?
ありがとう。
java - ForkJoinPool は大量のワーカーを作成します
ForkJoinPool を使用してタスクを並行して実行します。プログラムのログアウト出力を見ると、ForkJoinPool がタスクを実行するために大量のワーカーを作成しているようです (次のようなログ エントリがあります05 Apr 2016 11:39:18,678 [ForkJoinPool-2-worker-2493] <message>
)。
ForkJoinPool で構成した並列処理の数に従って実行される、作成された各タスクのワーカーがありますか、それとも何か間違っていますか? これが私がそれを行う方法です: