問題タブ [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 - Phaser - CountDownLatch(1) として使用するには?
単純にCountDownLatch
直接使用できることは理解していますが、演習として理解を深めるためPhaser
に、 の代わりに使用したいと思いますCOuntDownLatch
。
したがって、N 個の awaiter と、ラッチを反転する必要がある 1 つのスレッドを作成します。すべての待機者は、フリップの前に到着するとブロックされますが、ラッチがカウントダウンされた後は、後続のすべてのawait()
リターンが即座に返されます。
Phaser
これを達成する方法がわかりません... バリアは簡単です。N + 1 個のスレッドがあり、それぞれが到着して待機しているためです。ただし、最初のフェーズの後に待機するスレッドがないことを確認するには、どういうわけか私を避けます。
私が思いついた唯一の方法は、次のとおりです。
そして、もう一方のスレッドは、フェーザーを次のフェーズに進めるだけです。これは理想的ではないため、ポインタをいただければ幸いです。
java - ThreadPool を使用する Phaser が正しく到着して待機しません。どうすればこれを修正できますか?
私が Phaser をどのように使用するかについての基本的なアイデアと私が遭遇した問題を含むレポはここにあります: https://github.com/hipy/phaser/tree/master/src
Phaser を使用して、ThreadPools を使用して Dijkstra アルゴリズムをより効率的にすることに取り組んできました。ループを使用して多くの反復を行います。反復ごとに、現在の反復を続行する前に、ThreadPool 内のスレッドが終了するのを待つために Phaser が必要です。
問題が発生しました。Phaser が正しく待機しません。ArriveAndDeregister() を使用すると、各スレッドが完了した後に Phaser が終了状態に入ります。Arrive() を呼び出しても、未到着のパーティの数が減らないため、反復がスタックします。
以下のすべてのコードは、一度呼び出された apply() メソッドで実行されます。
以下のコードは、スレッドが実行するタスクを作成します。
以下のコードは、for ループの反復ごとに実行されます。この場合、30.000 回の反復があります。
アルゴリズムの一部のコードをスキップして、次のコードが for ループで実行され、スレッドが開始され、スレッドが終了するのを待ちます。
出力は次のとおりです。
最初のフェーズが実行され、完全な反復が行われます。第二段階は行き詰まる。未到着のパーティーの数は 6 です。3 つの新しいパーティーと、どうやら 3 つの古いパーティーは、phaser.arrive() を呼び出しても到着済みとして登録されませんでした。また、ArriveAndAwaitAdvance() は待機しませんでした。これは、次の反復で 3 ではなく 6 の未到着のパーティがあるためです。
ArrivalAndDeregister() を使用してみましたが、これによりフェーズが終了します (phasecount に大きな負の値があります)。
どうすればこれを解決できますか?フェーズを終了したくはありませんが、反復ごとに到着したパーティーを登録したいと思います。
ありがとう!