2009-05-06 11 views
16

私は、リモートホストに送信する必要があるメッセージに関する情報を保持するキューを使用するプロジェクトに取り組んでいます。この場合、1つのスレッドは情報をキューに入れる責任があり、別のスレッドは情報をキューから取得して送信する責任があります。 2番目のスレッドは、情報のキューを定期的にチェックする必要があります。JavaでBlocking Queueの利点は何ですか?

しかし、後で私はこれが車輪の再発明であることを発見しました。私はこの目的のためにブロックキューを使うことができました。

上記のアプリケーションにブロッキングキューを使用する他の利点は何ですか? (例:パフォーマンス、コードの変更、特殊なトリックなど)

答えて

26

主な利点は、BlockingQueueが正しいスレッドセーフな実装を提供することです。開発者はこの機能を長年にわたって実装してきましたが、それを正しく行うのは難しいです。ランタイムには、同時実行性の専門家によって開発、レビュー、およびメンテナンスされた実装があります。

キューの「ブロック」性質には、いくつかの利点があります。第1に、要素を追加する際に、キュー容量が制限されていると、メモリ消費量も制限されます。また、キューの消費者がプロデューサを大きく追い越しすぎると、プロデューサは要素を追加するのを待たなければならないので自然に抑制されます。キューから要素を取得する場合、主な利点はシンプルさです。永遠に待っていることは簡単ではなく、指定されたタイムアウトを正しく待つことはもう少し複雑です。

6

ブロックキューで削除する重要なことは、「ポーリング」です。これはあなたの言うところです

その場合、2番目のスレッドは情報のキューを定期的にチェックする必要があります。

これは非常に非効率的であり、多くの不必要なCPU時間を使用します。また、不要なレイテンシを導入する可能性もあります。

3

This articleについてはこれに関する良い議論があります。

12

ブロッキングキューは、そのキューからデキューしようとしたときにキューが空である場合、またはキューに項目をエンキューしようとしたときにキューがすでにいっぱいになっている場合にブロックされるキューです。空のキューからデキューしようとするスレッドは、他のスレッドがアイテムをキューに挿入するまでブロックされます。 1つまたは複数のアイテムをデキューするか、キューを完全にクリアすることによって、他のスレッドがキュー内にスペースを作るまで、フル・キュー内のアイテムをエンキューしようとしているスレッドはブロックされます。

関連する問題