7種類のブロックキュー
22561 ワード
目に見えるのはあなたのものではありませんが、あなたが見た後にその思想を復刻した産物はあなたのものです.参考になることは何ですか.
シーケンス
本文は互いに学び、分かち合い、技術の蓄積でゆっくりと沈殿させる態度で書き、間違いがあれば皆さんのご指摘をお願いします.
本文に現れるコードはjdk 1.8から来ている
キュー
FIFO(先進先出)のデータ構造がキュー
ブロックキュー
操作がブロックされるキューはブロックキューであり,javaにおけるBlockingQueueインタフェースはQueueインタフェースに基づいて2組のブロックメソッド,offer(e,time)put,poll(time)take()を追加した.
Javaの7つのブロックキューについてもお話しします境界:キューの作成時に指定するキューサイズが必要または許可され、例外を放出するaddメソッド を呼び出すことができる.無境界:キューの作成時にキューサイズを指定する必要がない、または指定できない、add=offer操作 を無制限に挿入
キューをブロックするいくつかの操作方法
異常を投げ出す
特殊値
ブロッキング
タイムアウト
挿入
add(e)
offer(e)
put(e)
offer(e,time,unit)
削除
remove()
poll()
take()
poll(time,unit)
けんさ
element()
peek()
使用不可
使用不可
1.ArrayBlockingQueue[有界]
配列を使用して実装される境界付きブロックキューです.キューを作成するときは、キューのサイズを指定する必要があります.また、キューを作成するときに公平なアクセスを設定できます(ロックを再ロックする公平なアクセスによって実装されます).
要素がキュー容量の上限に達した場合に再エンキュー
呼び出しの方法によって、異なるステータスを返します.
addメソッドは異常を放出します
offerメソッドはfalseを返します
putメソッドは無限時ブロック
offer(E e,long timeout,TimeUnit unit)はタイムアウトします
キューが空の場合に要素を取得する場合
Pollメソッドが空に戻る
take無限時ブロック
Poll(long timeout,TimeUnit unit)タイムアウトブロック
まとめ:配列境界キュー フェアポリシー に参加可能挿入時に放出可能な異常動作 が提供する.挿入要素は空ではありません このキュー・モードは、公平なアクセスが必要なシーンで使用するのに適しており、公平性が要求されていない場合は、操作配列と公平性のため、スループットが低下します.
2.LinkedBlockingQueue[有界]
チェーンテーブルを使用して実装される境界キュー
サイズを指定しない場合、デフォルト値はintの最大値です
要素がキュー容量の上限に達した場合に再エンキュー
キューが空の場合に要素を取得する場合
[ArrayBlockingQueue](#1.ArrayBlockingQueue[境界])と同じ
まとめ:結論キューサイズは指定せず、デフォルト値はint最大値 である.スループットはArrayBlockingQueueより 高いチェーンテーブル境界キュー フェアポリシー に参加できません.挿入時に放出可能な異常動作 が提供する.挿入要素は空ではありません 3.LinkedBlockingDeque[有界]
チェーンテーブルによって実現される両端ブロックキュー(LikedBlockingQueueはキューの最後の動作を増加させる)
このキューには、チームの最初のキューの最後の操作方法が追加されました.
クラス(add/put/offer)を追加する元のメソッド呼び出しは、同じ接頭辞lastメソッドを呼び出す操作と同じです.
取得クラス(peek/poll/element)の元のメソッド呼び出しは、同じ接頭辞firstメソッドを呼び出す操作と同じです.
要素がキュー容量の上限に達した場合に再エンキュー
addメソッドは、キュー容量が最大値に達したときに異常
キューが空の場合に要素を取得する場合
Element/getFirst/getLastメソッドキューが空の場合に例外
まとめ:キューの作成時にキューサイズを指定しない場合、デフォルト値はint最大値 です.スループットはLinkedBlockingQueueより 高いチェーンテーブル有界両端キュー フェアポリシー に参加できません.挿入時に放出可能な異常動作 が提供する.挿入要素は空ではありません 要素 は、キューヘッダヘッダを介して挿入または取り出すことができる.
4.LinkedTransferQueue[無境界]
チェーンテーブルによって実現される無境界変換キューは、[LinkedBlockingQueue](#2.LinkedBlockingQueue[有界])に対していくつかの方法を追加する.
1.transfer(E e)
消費者呼び出しの返却を待つ
キューの呼び出しブロックに直接要素を提供し、誰も取得しない場合は、この要素をキューの最後に配置し、この要素がキューから出たときに戻ります.そうしないと、ブロックされます.
2.tryTransfer(E e)
呼び出すとすぐ戻る
キューの呼び出しブロックに直接要素を提供しようとすると、すぐにfalse or trueに戻り、提供された要素はキューに入れない.
3.tryTransfer(E e, long timeout, TimeUnit unit)
消費者の呼び出しが戻ってくるのを待っていて、一定時間以内に待っても戻ってこない.
tryTransferに時間を加えて、与えられた時間内に試してみました
ブロック呼び出し者がキューのtakeまたはpoll(time)メソッドを直接呼び出すと、ブロック状態で値が返されます.
ブロック呼び出しがない場合は、エレメントをキューの最後に入れる、所定時間内に呼び出されてtrueを返し、所定時間内に呼び出されていない場合はfalseを返し、エレメントをキューから除去する.
まとめ:作成時にキューサイズを指定する必要はなく、最大値であるブロックなし挿入メモリオーバーフローを認識する スループットはLinkedBlockingQueueより 高いチェーンテーブル無境界キュー 呼び出しキュー要素がブロックすると、エンキュー要素を直接返すことができるtransferメソッド が提供される.挿入要素は空ではありません 5.PriorityBlockingQueue[無境界]
配列+コンパレータを使用して実装される優先キュー
このキューは二叉スタックソート方式を用いて優先度を実現する
このキューの重点内容についても二叉山ソートで、ここに延びる内容は比較的多いですが、スタック構造、二叉山、スタックソート、選択ソート...
まとめ:キューを作成するときにキューサイズを指定しない場合、デフォルト値は11で、超過するとブロックすることなく拡張(int最大値-8を超えるとスタックメモリオーバーフロー異常が放出される)現在のキューサイズの50% に拡張されます.配列無境界キュー(最大長int最大値-8) コンパレータを指定する場合は、サイズ を指定する必要があります.挿入要素は空ではありません 6.DelayQueue[無境界]
PriorityQueueを使用して実装される無境界遅延キューです.このキューを使用するには、遅延構成、比較器の実装など、独自にいくつかのコンテンツを実装する必要があります.このキューは、タイミングタスクスケジューリング、サイクルタスクスケジューリングに使用できます.
要素の優先度、実行タイミングを指定する必要がある場合は、このキューは2つの選択肢です.
まとめ:要素ストレージで使用されるpriorityqueue は、要素のアクセス遅延時間および優先度 を指定することができる.挿入要素は空ではありません 7.SynchronousQueue[容量なし]
dual queue+dual stackデュアルキュー+デュアルスタック実装
このキューも比較的特殊なキューであり、JDK 1.6の時に下位実装を書き換えたのは、上述の方法である.
このキューは容量のないキューなので、呼び出し方法にはいくつか違いがあります.
addメソッドは
offerメソッドはfalseを返します
putメソッドがブロックされます
デキューメソッドを呼び出すにもいくつかの問題があります.
Pollメソッドはnullを返します
takeメソッドがブロックされます
エンキューとデキューを同期して実行すればよいのも、スループットが最も高いキューである理由です.
まとめ:容量なし スループットはArrayBlockingQueueとLinkedBlockingQueueより 高いフェアポリシー に参加可能挿入時に放出可能な異常動作 が提供する.挿入要素は空ではありません
シーケンス
本文は互いに学び、分かち合い、技術の蓄積でゆっくりと沈殿させる態度で書き、間違いがあれば皆さんのご指摘をお願いします.
本文に現れるコードはjdk 1.8から来ている
キュー
FIFO(先進先出)のデータ構造がキュー
ブロックキュー
操作がブロックされるキューはブロックキューであり,javaにおけるBlockingQueueインタフェースはQueueインタフェースに基づいて2組のブロックメソッド,offer(e,time)put,poll(time)take()を追加した.
Javaの7つのブロックキューについてもお話しします
キューをブロックするいくつかの操作方法
異常を投げ出す
特殊値
ブロッキング
タイムアウト
挿入
add(e)
offer(e)
put(e)
offer(e,time,unit)
削除
remove()
poll()
take()
poll(time,unit)
けんさ
element()
peek()
使用不可
使用不可
1.ArrayBlockingQueue[有界]
配列を使用して実装される境界付きブロックキューです.キューを作成するときは、キューのサイズを指定する必要があります.また、キューを作成するときに公平なアクセスを設定できます(ロックを再ロックする公平なアクセスによって実装されます).
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();
}
要素がキュー容量の上限に達した場合に再エンキュー
呼び出しの方法によって、異なるステータスを返します.
addメソッドは異常を放出します
public boolean add(E e) {
if (offer(e))
return true;
else
throw new IllegalStateException("Queue full");
}
offerメソッドはfalseを返します
public boolean offer(E e) {
checkNotNull(e);
final ReentrantLock lock = this.lock;
lock.lock();
try {
if (count == items.length)
return false;
else {
enqueue(e);
return true;
}
} finally {
lock.unlock();
}
}
putメソッドは無限時ブロック
public void put(E e) throws InterruptedException {
checkNotNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);
} finally {
lock.unlock();
}
}
offer(E e,long timeout,TimeUnit unit)はタイムアウトします
public boolean offer(E e, long timeout, TimeUnit unit)
throws InterruptedException {
checkNotNull(e);
long nanos = unit.toNanos(timeout);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length) {
if (nanos <= 0)
return false;
nanos = notFull.awaitNanos(nanos);
}
enqueue(e);
return true;
} finally {
lock.unlock();
}
}
キューが空の場合に要素を取得する場合
Pollメソッドが空に戻る
public E poll() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return (count == 0) ? null : dequeue();
} finally {
lock.unlock();
}
}
take無限時ブロック
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == 0)
notEmpty.await();
return dequeue();
} finally {
lock.unlock();
}
}
Poll(long timeout,TimeUnit unit)タイムアウトブロック
public E poll(long timeout, TimeUnit unit) throws InterruptedException {
long nanos = unit.toNanos(timeout);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == 0) {
if (nanos <= 0)
return null;
nanos = notEmpty.awaitNanos(nanos);
}
return dequeue();
} finally {
lock.unlock();
}
}
まとめ:
2.LinkedBlockingQueue[有界]
チェーンテーブルを使用して実装される境界キュー
public LinkedBlockingQueue(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node<E>(null);
}
サイズを指定しない場合、デフォルト値はintの最大値です
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
要素がキュー容量の上限に達した場合に再エンキュー
キューが空の場合に要素を取得する場合
[ArrayBlockingQueue](#1.ArrayBlockingQueue[境界])と同じ
まとめ:
チェーンテーブルによって実現される両端ブロックキュー(LikedBlockingQueueはキューの最後の動作を増加させる)
このキューには、チームの最初のキューの最後の操作方法が追加されました.
add -> addFirst(push)/addLast
offer -> offerFirst/offerLast
offer(time) ->offerFirst(time)/offerLast(time)
peek -> peekFirst/peekLast
poll -> pollFirst/pollLast
poll(time) -> pollFirst(time)/pollLast(time)
put -> putFrist/putLast
クラス(add/put/offer)を追加する元のメソッド呼び出しは、同じ接頭辞lastメソッドを呼び出す操作と同じです.
: add = addLast ; put = putLast
取得クラス(peek/poll/element)の元のメソッド呼び出しは、同じ接頭辞firstメソッドを呼び出す操作と同じです.
: peek = peekFirst; poll = peekFirst
要素がキュー容量の上限に達した場合に再エンキュー
addメソッドは、キュー容量が最大値に達したときに異常
throw new IllegalStateException("Deque full");
を放出するキューが空の場合に要素を取得する場合
Element/getFirst/getLastメソッドキューが空の場合に例外
if (x == null) throw new NoSuchElementException();
を放出まとめ:
4.LinkedTransferQueue[無境界]
チェーンテーブルによって実現される無境界変換キューは、[LinkedBlockingQueue](#2.LinkedBlockingQueue[有界])に対していくつかの方法を追加する.
1.transfer(E e)
消費者呼び出しの返却を待つ
キューの呼び出しブロックに直接要素を提供し、誰も取得しない場合は、この要素をキューの最後に配置し、この要素がキューから出たときに戻ります.そうしないと、ブロックされます.
2.tryTransfer(E e)
呼び出すとすぐ戻る
キューの呼び出しブロックに直接要素を提供しようとすると、すぐにfalse or trueに戻り、提供された要素はキューに入れない.
3.tryTransfer(E e, long timeout, TimeUnit unit)
消費者の呼び出しが戻ってくるのを待っていて、一定時間以内に待っても戻ってこない.
tryTransferに時間を加えて、与えられた時間内に試してみました
ブロック呼び出し者がキューのtakeまたはpoll(time)メソッドを直接呼び出すと、ブロック状態で値が返されます.
ブロック呼び出しがない場合は、エレメントをキューの最後に入れる、所定時間内に呼び出されてtrueを返し、所定時間内に呼び出されていない場合はfalseを返し、エレメントをキューから除去する.
まとめ:
配列+コンパレータを使用して実装される優先キュー
このキューは二叉スタックソート方式を用いて優先度を実現する
このキューの重点内容についても二叉山ソートで、ここに延びる内容は比較的多いですが、スタック構造、二叉山、スタックソート、選択ソート...
まとめ:
PriorityQueueを使用して実装される無境界遅延キューです.このキューを使用するには、遅延構成、比較器の実装など、独自にいくつかのコンテンツを実装する必要があります.このキューは、タイミングタスクスケジューリング、サイクルタスクスケジューリングに使用できます.
要素の優先度、実行タイミングを指定する必要がある場合は、このキューは2つの選択肢です.
まとめ:
dual queue+dual stackデュアルキュー+デュアルスタック実装
このキューも比較的特殊なキューであり、JDK 1.6の時に下位実装を書き換えたのは、上述の方法である.
このキューは容量のないキューなので、呼び出し方法にはいくつか違いがあります.
addメソッドは
java.lang.IllegalStateException: Queue full
異常を放出しますofferメソッドはfalseを返します
putメソッドがブロックされます
デキューメソッドを呼び出すにもいくつかの問題があります.
Pollメソッドはnullを返します
takeメソッドがブロックされます
エンキューとデキューを同期して実行すればよいのも、スループットが最も高いキューである理由です.
まとめ: