web-dev-qa-db-ja.com

Java Queues-なぜ「ポーリング」と「オファー」?

OK、だから私はJavaを長い間使用しており、最近OCJP試験の準備をしている。だれかが洞察を提供できるかどうか疑問に思っていたwhyメソッド名「poll」(従来の「pop」ではなく)および「offer」(asより伝統的な「プッシュ」とは対照的に)選択されましたか?私は特にJava.util.Queueインターフェースを見ていますが、より一般的な説明にも興味があります:)

これは、特定のコーディングシナリオよりもアカデミックな問題です。Sunが(Oracleが購入する前に行われたように)Sunが名前を選んだ理由を理解しようとしているだけです。

ああ、誰かが私を十字架につけるか、lmgtfyへのリンクを返す前に... google、yahoo、wiki、bing、およびSO検索基準またはここでそれを説明するいくつかの古い投稿を見逃した場合、私は事前に謝罪します。

32
zpangwin

これらのメソッドには JavaDoc で説明されている異なるセマンティクスがあるためです。 add/removeは無条件ですが、offer/pollは特別な値を返します

  • offerのみoffers新しい値ですが、受け入れられない場合があります。キューがいっぱいの場合

  • pollのみpollsの値ですが、値が存在しない可能性があるという事実を受け入れます。

さらに問題を複雑にするために、 BlockingQueue は、add/removeをブロックするためのメソッドの別のペアを導入します。もちろん、パラメーター/フラグの束で同じ名前を使用することもできますが、

smellyGet(boolean blocking, boolean failOnEmpty)

しかし、これはより良いデザインだと思いませんか?

        | Throws ex. | Special v. | Blocks | Times out
--------+------------+------------+--------+---------------------
Insert  | add(e)     | offer(e)   | put(e) | offer(e, time, unit)
Remove  | remove()   | poll()     | take() | poll(time, unit)
Examine | element()  | peek()     | N/A    | N/A

* https://meta.stackexchange.com/questions/73566

35

QueueとStackを混同しています。プッシュとポップは後者に関連付けられています。

適切な生産者/消費者のコンテキストでキューを考えてください。投票と申し出ははるかに理にかなっています。

9
duffymo

Queueインターフェースは、リストの最初の要素を操作するためのいくつかのメソッドを定義します。これらのメソッドは動作が異なります。これらの方法は次のとおりです。

peek()
element()
poll()
remove()

peek()このメソッドは、キューから削除せずにキューの最初の要素の値を取得します。メソッドの呼び出しごとに常に同じ値を取得し、その実行はキューのサイズに影響しません。 キューが空の場合、peek()メソッドはnullを返します

element()このメソッドはpeek()と同様に動作するため、最初の要素の値を削除せずに再び取得します。ただし、リストが空の場合element()NoSuchElementExceptionをスローします

poll()このメソッドは、キューから最初の要素を削除して値を取得します。 。呼び出しのたびにリストの最初の要素を削除し、リストが既に空の場合はnullを返しますが、例外をスローしません

remove()このメソッドはpoll()メソッドとして動作するため、リストの最初の要素を削除し、リストが空の場合はNoSuchElementExceptionをスローします

3
dinesh kandpal