2016-10-15 5 views
-1

イベント処理では、関数は値をコレクションに入れ、別のものは同じコレクションから値を取り出します。アイテムは、ソース(ソケット)から受け取った順序でコレクション内に配置し、同じ方法で読み取る必要があります。そうしないと、結果が変更されます。コレクションまたはデータ構造のいずれかがJavaでブロックされていない

キューは、ほとんどの人が推薦するコレクションですが、同時にアイテムが追加されるとキューがブロックされるため、追加が完了するまで待たなければならず、効率が悪くなり、操作の待ち時間が長くなります。

たとえば、あるスレッドはキューから読み取り、別のスレッドは同じキューに書き込みます。いずれかの操作は、ロックを解除するまでキュー上で一度に実行されます。これを回避するデータ構造はありますか?

+0

'Queue'はコレクションではなく、いくつかの実装ではインターフェイスです。あなたに合ったものを選んでください。 – EJP

+0

私の目的は、コレクションフレームワークの実装が、コレクションを取得して置く関数を持つことなく使用できるかどうかを尋ねることです。 – user64287

+0

その質問は、Queueを実装しているすべてのコレクションのJavadocを調べることで答えられます。 'Queue'インターフェースについて一連の誤った記述をすることではありません。 – EJP

答えて

2

ConcurrentLinkedQueueは、例の1つです。 java.util.concurrentから他のクラスをご覧ください。

具体的なケースでは、さらに優れた第三者のライブラリがあります。 LMAX Disruptor

0

実際、LinkedBlockingQueueは、ブロックするputメソッドとtakeメソッドのために、使用するアイテムがあるまで待つのが最も簡単で、別のアイテムを挿入するスペースが、容量がアクティブになっています。容量の設定はオプションです。キューを無制限に拡張することはできません。

一方、ArrayBlockingQueueは、その中で最も効率的で美しいものです。内部でリングバッファを使用しているため、固定容量でなければなりません。これはLinkedBlockingQueueよりも高速ですが、ディスラプターで達成できる最大スループットからはかなり離れています。

どちらの場合でも、ブロッキングは純粋に両側でオプションです。すべての並行キューの非ブロッキングAPIもサポートされています。ブロッキングAPIとノンブロッキングAPIを混在させることができます。

多くの場合、キューはボトルネックではなく、実際には混乱を起こすことはしばしば賢明なことです。これは待ち行列ではなく、異なる役割を持つ参加スレッド間で共有されるリングバッファ、すなわち典型的には1人のプロデューサ、1人の作業者、および1人の消費者である。設定が少し面倒ですが、現代のハードウェアでは、高価な揮発性変数を必要としませんが、マシン依存の読み書きをよりシリアルにするために、1秒間に約100万トランザクションの処理速度が可能です(基本的に、 );

+0

これは、ストリーム処理にとって望ましくないことです。そうではありません。私たちはいくつかの消費者とプロデューサー、1人のプロデューサーと1人の消費者を使用していません。そして、それがブロックしているなら、時間が経つにつれて、処理にそれを導入するレイテンシが増えます。 – user64287

+1

私はあなたに懇願しますか?私はあなたの文章を完全に解析することができませんでした... – yeoman

+0

ブロックはいくつかのプロデューサーと消費者についてのものではありませんが、消費者側のブロッキングtake()を使用することは、ポーリング/スリープ/キュー上でObject.waitを手動で呼び出し、プロデューサにObject.notify経由で通知させる – yeoman

関連する問題