7

従来のwait-notifyよりもCountDownLatchを使用する利点を理解するのに助けが必要です。notifyAll()は確かに同じことを行うと思いますが、使いやすいようです(おそらく慣れているためです)。

また、CountDownLatchのwait()とawait()の違いは何ですか?

ありがとう !

編集:私は私のクエリを言い換える必要があると思います:

ドキュメントによるとAwait()は言う:

スレッドが中断されない限り、現在のスレッドがラッチがゼロまでカウントダウンするまで待機します。

私にとって、wait()とawait()の違いを理解するのは難しいです-await()は実際に秘密裏にwait()を使用しており、カウントがゼロに達したときに暗黙のnotifyAll()があるようです。

私が尋ねるつもりだったのは、CountDownLatchを使用するのではなく、(独自のカウンター変数処理を使用して)単にwait-notifyAll()メカニズムを使用するべきではないのはなぜですか?

4

1 に答える 1

11

それらは確かに同じことをしません。CountDownLatchイベントカウントが0に達したときにのみ信号を送り、自動的にそれを行いwait-notifyます。同じ動作を実現したい場合は、独自のカウントを維持する必要があります。同じ動作を実装するとエラーが発生しやすくなるため、これを回避することをお勧めします(特に、並行性プログラミングを初めて使用する場合)。比較するCountDownLatchwait-notify、リンゴとオレンジの比較でさえほとんどありません。それは、自動ドリルと六角レンチを比較するようなものです。

notifyAll()とを使用したかどうかはわかりませんが、発生したイベントの数を数え続けない限りCountDownLatchnotifyAll()単独では同じ動作は得られません。CountDownLatchおそらく、一定数のタスクを実行し、それらのタスクが完了するのを待ってから、プログラムの残りの部分の実行を再開するのに最も適しています。ThreadPool固定数のスレッド(たとえば)が固定数のタスクを実行している場合に特に役立ちますが、スレッドはタスクよりもはるかに少なく、それらを再利用する必要があります。を使用するCountDownLatchと、すべてのタスクが完了するのを簡単に待つことができます。notifyAll()同じ振る舞いを実現するためにあなたがどのように使っているのかわかりませんが、waitNotify()より適切です)。

wait()との違いについては、await()少しがっかりしました!ドキュメントを検索することは、質問のステップ1です。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

await()はの実際の関数ですがCountDownLatchwait()から継承されObjectます。ドキュメントで何が行われているのかを確認することをお勧めします。

于 2012-05-15T04:17:45.450 に答える