問題タブ [countdownlatch]

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.

0 投票する
7 に答える
58730 参照

java - CountDownLatch とセマフォ

利用するメリットはありますか

java.util.concurrent.CountdownLatch

それ以外の

java.util.concurrent.Semaphore ?

私が知る限り、次のフラグメントはほぼ同等です。

1.セマフォ

2: カウントダウンラッチ

ただし、#2 の場合はラッチを再利用できず、さらに重要なことに、作成されるスレッドの数を事前に知る必要があります (または、すべてのスレッドが開始されるまで待ってからラッチを作成します)。

では、どのような状況でラッチが望ましいのでしょうか?

0 投票する
3 に答える
11660 参照

java - 別のスレッドで条件が解決されるまで、1 つのスレッドをスリープ状態にする

これは、(私が思うに) 同じことを達成する 2 つのコードの塊です。

私は基本的に、Java 1.5 の同時実行性を使用して Thread.sleep(long) から逃れる方法を学ぼうとしています。最初の例では ReentrantLock を使用し、2 番目の例では CountDownLatch を使用しています。私がやろうとしていることの要点は、別のスレッドで状態が解決されるまで、1 つのスレッドをスリープ状態にすることです。

ReentrantLock は、他のスレッドをウェイクアップするかどうかを決定するために使用しているブール値にロックを提供し、次に条件を await/signal と共に使用して他のスレッドをスリープさせます。私が知る限り、ロックを使用する必要がある唯一の理由は、複数のスレッドがブール値への書き込みアクセスを必要とする場合です。

CountDownLatch は ReentrantLock と同じ機能を提供しているようですが、(不要な?) ロックはありません。ただし、必要なカウントダウンが1つだけで初期化することで、意図した用途を乗っ取っているような気がします。複数のスレッドが1つのタスクで待機している場合ではなく、複数のスレッドが同じタスクで動作する場合に使用することになっていると思います。

だから、質問:

  1. ReentrantLock コードで「正しいこと」のためにロックを使用していますか? 1 つのスレッドでブール値にのみ書き込みを行う場合、ロックは必要ですか? 他のスレッドを起動する前にブール値をリセットする限り、問題は発生しませんよね?

  2. このタスクにより自然に適した、ロックを回避するために使用できる CountDownLatch に似たクラスはありますか (このインスタンスではロックを回避する必要があると仮定します)。

  3. このコードを改善するために知っておくべき他の方法はありますか?

例 1:

例 2:

0 投票する
3 に答える
10363 参照

javascript - jQuery Countdown プラグインと AJAX

jQuery カウントダウン プラグインを使用してカウントダウンを実装し、タイマーが切れたときに Web サービスを呼び出します。

問題は、ページで AJAX を使用していて、AJAX リクエストごとに次のようにカウントダウンを再設定する必要があることです。

これにより、何らかの理由で、リクエストごとに Countdown の新しいインスタンスが作成され、Countdown の有効期限が切れると Webservice が多数呼び出されます。

カウントダウンのインスタンスが一度に 1 つだけ存在するようにするにはどうすればよいですか?

編集

ドキュメントでこれを見つけましたが、私にはそれをしません

0 投票する
6 に答える
9116 参照

java - 柔軟なCountDownLatch?

ExecutorServiceプロデューサースレッドがN個の作業項目を生成し、それらをに送信してから、 N個の項目がすべて処理されるまで待機する必要があるという問題が2回発生しました。

警告

  • Nは事前にはわかりません。もしそうなら、私は単にを作成し、すべての作業が完了するまでCountDownLatchプロデューサースレッドを作成します。await()
  • 私のプロデューサースレッドはブロックする必要がありますが(つまり、を呼び出すことによって)、プロデューサースレッドの待機を停止させるために、すべての作業が完了したことを通知する方法がないため、を使用することCompletionServiceは不適切です。take()

私の現在の好ましい解決策は、整数カウンターを使用し、作業項目が送信されるたびにこれをインクリメントし、作業項目が処理されるときにそれをデクリメントすることです。N個のタスクすべてを送信した後、プロデューサースレッドはロックを待機し、counter == 0通知されるたびにチェックする必要があります。コンシューマースレッドは、カウンターがデクリメントされ、新しい値が0の場合、プロデューサーに通知する必要があります。

この問題へのより良いアプローチはありjava.util.concurrentますか、それとも「自分でローリング」するのではなく、使用すべき適切な構成がありますか?

前もって感謝します。

0 投票する
2 に答える
10412 参照

c# - JavaのCountDownLatchに相当するC#はありますか?

Java のCountDownLatchに相当する C# はありますか?

0 投票する
1 に答える
1409 参照

java - JFrameが破棄するのを待機するために使用されるJavaCountDownLatch

この前の質問と他のソースを参照しましたが、CountDownLatchを正しく機能させることができません。

背景:mainFrameは、dataEntryFrameという新しいフレームを作成します。dataEntryFrameの[送信]ボタンをクリックすると、レコードがデータベースに追加され、dataEntryFrameが破棄されます。この時点で、mainFrameはすべてのレコードを表示するjListをクリアしてリロードする必要があります。

問題:dataEntryFrameがロードされると、Javaがフリーズし、dataEntryFrameコンポーネントがロードされません。この部分を通過できません...次に、DataEntryFrameで、CountDownLatchは、送信ボタンがクリックされた後にのみデクリメントし、データベーステーブルにレコードを正常に追加し、それ自体を破棄する必要があります。または、ユーザーが[キャンセル]をクリックしたとき...

コード:メインフレームから

コード:DataEntryFrameから

0 投票する
14 に答える
96930 参照

java - Javaの同時実行性:カウントダウンラッチとサイクリックバリア

java.util.concurrent APIを読んでいたところ、

  • CountDownLatch:他のスレッドで実行されている一連の操作が完了するまで、1つ以上のスレッドが待機できるようにする同期支援。
  • CyclicBarrier:一連のスレッドが互いに共通のバリアポイントに到達するのをすべて待機できるようにする同期支援。

私には両方とも同じように見えますが、それ以上のものがあると確信しています。

たとえば、CoundownLatch, the countdown value could not be reset, that can happen in the case of CyclicBarrier

2つの間に他の違いはありますか?誰かがカウントダウンの値をリセットしたい場所はどこですか
use cases

0 投票する
2 に答える
1307 参照

java - CountdownLatchはawait(maxTime)とcountdown()を組み合わせます

ほぼ無限の時間と反復回数で複数のスレッドを実行しています。最良の解決策が見つかった場合、反復回数は0にリセットされます。無限ループを防ぐために、最大反復回数が設定されます。

カウントダウンラッチを使用して、すべてのスレッドが最大反復回数に達したときにプロセスを停止します。つまり、スレッドが最大反復回数に達すると、 notifyThreadStop()を使用してメインスレッドに通知します。これにより、すべてのスレッドが停止すると、countdown()がトリガーされます。

注:私のスレッドはFixedThreadPoolExecutorService内で実行されています。

maxTimeラッチを追加したいと思います。だから私がしたことは次のとおりです

これで、カウントダウンによってラッチがトリガーされた場合は、すべてのスレッドが停止しているため、ExecutorServiceをシャットダウンできることがわかりました。

最大時間に達した場合はそうではありません。したがって、(1)では、すべてのランナーを繰り返し処理して、文明的な方法でランナーを終了させたいと思います:-)。そのために、私は関数requestTermination()を定義しました。これは、簡単に言えば、runnablesでiterationCounterをMaxIterationCountに設定します。

したがって、(1)は

さて、先に進む前に、すべてのスレッドが実際に停止するまでもう一度待つ必要があります。

したがって、(2)は

もちろん、私の関数notifyThreadStop()はそれを変更する必要があり、mylatchではなくmylatch2でcountdown()を実行するように指示するフラグが必要になります。

質問に答えたばかりだと思いますが、これがすべて書かれているので、他の人が参照できるようにここに残しておきます。

問題は次のようになります:これを処理するためのより良い方法はありますか?(1)または(2)のshutdownNow()だけが必要ですか?私のスレッドは、終了する前に、自分のログファイルを閉じて、内側のCallableスレッド*ss*をシャットダウンする必要があることを知っています。

0 投票する
3 に答える
2472 参照

java - Javaの並行性:軽量のノンブロッキングセマフォ?

一度実行したいコールバックがある状況があります。議論のために、次のように見えるとしましょう。

ここで、X は、次の動作を行う並行オブジェクトです。

  • コンストラクタ: X(int N) -- N 個の使用許可を割り当てます

  • boolean use(): 使用許可が 1 つでもある場合、そのうちの 1 つを消費して true を返します。それ以外の場合は false を返します。この操作は、複数のスレッドに関してアトミックです。

これにはjava.util.concurrent.Semaphoreを使用できることはわかっていますが、ブロッキング/待機の側面は必要ないため、これを 1 回限りの使用にしたいと考えています。

私が何かをしない限り、AtomicIntegerは十分に見えません

while ループにうんざりします。

countDown() メソッドには戻り値がなく、getCount() を使用してアトミックに実行できないため、CountDownLatch は機能しません。

セマフォを使用するだけですか、それともより適切なクラスがありますか?