0

java.util.concurrent.LinkedBlockingQueueの簡単な説明は、それが FIFO キューであると述べています。これは、スレッド A が最初に一連のエントリ (a1、a2、... an) をキューに追加し、次にスレッド B がさらにいくつかのものを追加した場合を意味します。キュー (b1、b2、... bm) に追加すると、一部のコンシューマー スレッドは、B からこれらを取得する前に、A からのすべてのエントリを使い果たす必要があります (したがって、FIFO)。しかし、私が見たのは、A からのエントリと B からのこれらのエントリは、B が A よりもはるかに後でエントリを追加したにもかかわらず、インターリーブされているということですLinkedBlockingQueue。クライアントからの要求エントリを処理するための非同期ワーカー スレッド。

遅れて到着したリクエストは、以前のエントリがすべて使い果たされるまでキューで待機する必要があるため (クライアントはリクエストごとに数千のエントリを送信できます)、コードの公平性について質問していましたが、驚いたことに、遅れて到着したクライアントは応答を受け取りました。ほとんどすぐに戻ります。これはLinkedBlockingQueueFIFOではないということですか?? とても困っているので助けてください。

4

1 に答える 1

3

キューは FIFO であり、オブジェクトがスレッドによってキューから削除される順序は FIFO です。スレッドがオブジェクトを取得してメソッドの実行を開始すると、FIFO の順序が失われます。

「A からのエントリと B からのエントリがインターリーブされている」ことをどのように判断できますか?

于 2012-09-20T22:21:44.960 に答える