問題タブ [phaser]
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 でのフェイザー シンクロナイザーの例
Phaser に関する Javadocs を読んだところですが、バリア実装が JDK 自体に適用されているかどうかを尋ねるのは理にかなっています (私は と考えていますJDK7
)。Phaser
JavaDocが述べたように
Phaser は、ForkJoinPool で実行されるタスクによっても使用される場合があります。
そこで、 で Phaser の使い方を調べてみましたForkJoinPool
が、何も見つかりませんでした。目標は、を使用して実際の例を見つけることPhaser
です。
java - ForkJoinPool、Phaser、マネージド ブロッキング: デッドロックに対してどの程度機能しますか?
次の小さなコード スニペットは、jdk8u45 では終了せず、jdk8u20 では正常に終了していました。
フェイザーのドキュメントには、次のように記載されています
Phaser は、ForkJoinPool で実行されているタスクでも使用できます。これにより、フェーズが進むのを待っている他のタスクがブロックされている場合に、タスクを実行するのに十分な並列性が保証されます。
ただし、ForkjoinPool#mangedBlock の javadoc には次のように記載されています。
ForkJoinPool で実行している場合は、最初にプールを拡張して、十分な並列性を確保することができます
そこにあるのは5月だけです。したがって、これがバグなのか、それとも Phaser/ForkJoinPool のコントラクトに依存していない単に悪いコードなのかはわかりません。Phaser/ForkJoinPool の組み合わせのコントラクトは、デッドロックを防ぐためにどの程度機能しますか?
私の設定:
- Linux adc 3.14.27-100.fc19.x86_64 #1 SMP Wed Dec 17 19:36:34 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
- 8 コア i7
java-8 - 例を使用して Java のフェイザーを理解する
Java で Phaser を理解しようとしています。他のパーティーが到着するのを待って事前に立ち往生している例を書きました。
私が理解している限り、フェーザーは再利用可能なスレッド同期 (再利用できない CountdownLatch とは異なり) バリア アクションを備えたバリアとして使用されます (状態を共有するために使用される Cyclicbarrier とは異なり、Phaser はバリア アクションで状態を共有する必要はありません)。私が間違っている場合は修正してください。
したがって、私の例では、特定の数のパーティ/スレッドがバリアに到達した後、各スレッドでランダムな加算および減算コードを実行しようとしています。私は何を間違っていますか?
java - フェイザーを使用してランナブルが順番に実行されるようにする方法
実行のためにフェーザーに送信されているランナブルのリストがありますが、呼び出された順序で実行されません。たとえば、2 つのランナブルを Phaser に送信すると、「testing 0 testing 1」と出力されるはずですが、「testing 1 testing 0」と出力されることがあります。
コードは次のとおりです。
java - 制限のため、柔軟な CountDownLatch は Phaser を使用できません
N エントリの大きなファイルを受信しています。エントリごとに、新しいスレッドを作成しています。N 個のスレッドがすべて終了するのを待つ必要があります。
当初は Phaser を使用していましたが、その実装は 65K パーティーに制限されています。N は 100K のようになる可能性があるため、爆発しています。
次に、CountDownLatch を試してみました。これはうまく機能し、非常に単純な概念と非常に単純な実装です。しかし、Nの数がわかりません。
フェイザーは私のソリューションですが、その制限があります。
何か案は?
この投稿は関連しています: Flexible CountDownLatch?
java - フェイザー同期の使用
一般的な質問
JavaDocsおよびNiklas Schlimm によるこのブログに記載されているように、Phaser を使用してすべてのタスクの開始時刻を同期できることはよく知られています。
Niklas は、同期の非常にわかりやすいイメージを描きました。
ここで、タスクの階層があるとします。
したがって、依存関係のツリーは次のようになります。
一般的に、解決すべき依存関係のツリーがあります (たとえば、ゲーム パイプラインでは、AI / ゲーム ロジック / レンダリング タスクなどがあります)。幸いなことに、「大きな」同期ポイントがあり、ツリーは固定されています (ただし、パーティの数は固定されていません)。いくつかのフェイザーで解決するのは簡単です。しかし、フェイザーを 1 つだけ使用することは可能ですか?
1つの特別なケース
具体的には、以下の問題を解決するプログラムを作成しました。
ここにコード:
複数の が使用されていることがわかりますPhaser
。(上記のように)複数のフェイザーを保持する方が良いですか、それとも大きなフェイザーを 1 つだけ使用する方が良いですか? または、Javaで推奨される他の同期方法はありますか?
java - フェーズ終了後の java.util.concurrent.Phaser コールバック
Phaser
パッケージから調べて、java.util.concurrent
コードサンプルを書きました:
出力:
私が望むものとは少し異なる出力:
が欲しいです :
したがって、両方 の後に厳密に、前に厳密にphase X finished
印刷されることを望みますPhaseThread # start execute phase X
PhaseThread # start execute phase X+1
コードが不適切に動作する理由は理解していますが、目的の動作を実現する方法がわかりません。Phaser
随所に機能性を網羅していると書かれているのであり得ると思いCyclicBarrier
ます。