二つのブロッキングキューはキューのサポート追加の操作です。これら二つの追加運用サポートの挿入と閉塞の除去方法:
1)ブロッキング挿入方法をサポート:キューが一杯になると、実行待ち行列挿入スレッドブロック
2)をサポートするブロッキング除去方法:キューが空である場合、キューは、スレッド実行除去をブロックします
方法:
方法/アプローチ | 例外を投げます | 特別な値を返します。 | ブロックされています | タイムアウト終了 |
---|---|---|---|---|
挿入方法 | (e)を追加 | プラン(E) | 置く(E) | プラン(E、時間、単位) |
除去方法 | ノー | 世論調査() | 取る() | 世論調査(時間、単位) |
検出 | 素子() | ピーク() | ノー | ノー |
- 例外をスローします:キューがいっぱいになると、挿入要素がスローされます
IllegalStateException
。 - 特別な値を返します:trueを返す、挿入はfalseを返す失敗正常に挿入する際のオファー()メソッドは、エンキューであり、チームが成功し、キューが空またはnullの場合にポーリング()は、要素の戻り値をデキューされます
- ブロックされています:キューが満杯になると、実行をブロックするの糸挿入方法は、キューが空の場合、実行チームアプローチのスレッドをブロック
- タイムアウト終了:名前が示すように
ジャワ、中JDK7がキュー7の合計を阻止するには、各クラスが継承しますAbstractQueue
:
- ArrayBlockingQueue
- LinkedTransferQueue
- SynchronousQueue
- DelayQueue
- LinkedBlockingDeque
- LinkedBlockingQueue
- PriorityBlockingQueue
ArrayBlockingQueue
アレイによって達成されるようなキューをブロック境界、FIFOの原理に従って配置された要素のキュー。スレッドはキューへの公平なアクセスを保証するものではありません、いわゆる公平なアクセスがブロックされたスレッドは、最初にデフォルトでアクセスをブロックすることであるため、に従ってキューへのアクセスをブロックすることを意味します。フェアアクセスがReentrantLockのの公正ロックすることにより実現されます。
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
- 配列が直接作成したので、ArrayBlockingQueueの長さは、変更することはできません
- フェアロックをReentrantLockのために設定した場合、それ以降のすべてのロックの競争がそれを行うことと条件、小さなパートナーの条件原則は考えて見ていない公正な競争を、でしょうか?答えは、競争のロックに参加するために目覚める、私たちはロック競争の中で公正な競争を遵守します条件です。
LinkedBlockingQueue
このクラスは、(カウンターにInteger.MAX_VALUEまで数えることができるという理由だけでも、制限されていない)有界ブロッキングキューを達成するためのリンクリストです。このキューのデフォルトと最大長はInteger.MAX_VALUEです。要素は、FIFO原理に従って配置されています。
PriorityBlockingQueue
このクラスは、サポート無制限のブロッキング優先度キューです。自然の要素はデフォルトで昇順にソートされてください。カスタムクラスは、照合要素を指定するために、または初期化コンパレータ要素の種類を指定するために)(のcompareToを実装することができます。
:参照してください、ピットは記入しませ後でビットを埋めます
DelayQueue
アンバウンド形式のブロッキングキューの要素の取得支援遅延。キューを使用しPriorityQueue
実施され、キュー要素が遅れインターフェイスを実装し、その要素を作成しなければならないことは、それは、キューから現在の原色を得るために遅延が経過したキューから抽出された要素だけを要する時間を指定することができます。
シナリオを使用します。
- デザイン・キャッシング・システム:あなたがされるまで有効なキャッシュを表す要素を取得するからでDelayQueue後、糸ループクエリDelayQueueを使用して、DelayQueueの有効性とキャッシュ要素を保存することができます
- タスクスケジューリングのタイミング:DelayQueueは最初からタスクの実行に得ればタスクとDelayQueueは一日保存された実行時間は、TimerQueueとして、実行されます
次のように実装プロセスは、次のとおりです。
まず、実装するDelayed
インタフェースを:
java @Override public long getDelay(TimeUnit unit){ // 返回当前元素还需要等待多久,当返回<0的值时,表示可以出队;>0时,表示仍需要等待 }
第二ステップ、オファーは()するたびにPriorityQueue
自分で要素を挿入するには、昇順にソートは、天然に記載します
時間は、ブロッキング以前よりも少なくなる場合第3のステップは、あなたが得るたびに、(ブロッキング機能を持たせるために、)(取るために呼び出します)
for (;;) {
E first = q.peek();
if (first == null)
available.await();
else {
long delay = first.getDelay(NANOSECONDS);
if (delay <= 0)
return q.poll();
first = null; // don't retain ref while waiting
if (leader != null)
available.await();
else {
Thread thisThread = Thread.currentThread();
leader = thisThread;
try {
available.awaitNanos(delay);
} finally {
if (leader == thisThread)
leader = null;
}
}
}
}
:見ることができ、特定のDelayQueueを理解するために
SynchronousQueue
キューのない記憶素子、プロデューサーの生産、消費者支出、各put操作はテイクアクションを待っている必要があり。キューは、消費者に渡さデータプロデューサースレッドのスレッドを処理するための責任があります。シーンを転送するためのより適切な。そして、そのスループットはArrayBlockingQueue LinkedBlockingQueueよりも高く、
LinkedTransferQueue
このクラスは、主に2つのメソッドが追加されますtransfer()
し、tryTransfer()
transfer()
待っている間に、消費者のスレッドが、プロデューサーはすぐに消費者に引き渡さ要素を生成する場合、主に、追加のエンキュー操作は必要ありません。消費者が待機していない場合、尾への最初のチームに。
tryTransfer()
要素をテストするために使用される生産者が消費者に直接渡すことができますされています。
:見ることができ、特定のLinkedTansferQueueを理解するために
概要
- ArrayBlockingQueue
- LinkedBlockingQueue
- LinkedBlockingDeque
- SynchronousQueue
4上記は、データ構造が比較的単純で、それぞれの方法は、比較的簡単に詳述されていません。残りの3つは、比較的大きな頭であり、比較的新しい、それだけでは説明実行する予定
この章では、キューをブロックし、他の機能でラフな表情で、いくつかの珍しいクラスのために、詳細な分析をフォローアップします(実際には、補助的なデータ構造とアルゴリズムの最初の波)