7種類のブロックキュー


目に見えるのはあなたのものではありませんが、あなたが見た後にその思想を復刻した産物はあなたのものです.参考になることは何ですか.
シーケンス
本文は互いに学び、分かち合い、技術の蓄積でゆっくりと沈殿させる態度で書き、間違いがあれば皆さんのご指摘をお願いします.
本文に現れるコードは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[有界]
    配列を使用して実装される境界付きブロックキューです.キューを作成するときは、キューのサイズを指定する必要があります.また、キューを作成するときに公平なアクセスを設定できます(ロックを再ロックする公平なアクセスによって実装されます).
    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[境界])と同じ
    まとめ:
  • 結論キューサイズは指定せず、デフォルト値はint最大値
  • である.
  • スループットはArrayBlockingQueueより
  • 高い
  • チェーンテーブル境界キュー
  • フェアポリシー
  • に参加できません.
  • 挿入時に放出可能な異常動作
  • が提供する.
  • 挿入要素は空ではありません
  • 3.LinkedBlockingDeque[有界]
    チェーンテーブルによって実現される両端ブロックキュー(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();を放出
    まとめ:
  • キューの作成時にキューサイズを指定しない場合、デフォルト値は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メソッドはjava.lang.IllegalStateException: Queue full異常を放出します
    offerメソッドはfalseを返します
    putメソッドがブロックされます
    デキューメソッドを呼び出すにもいくつかの問題があります.
    Pollメソッドはnullを返します
    takeメソッドがブロックされます
    エンキューとデキューを同期して実行すればよいのも、スループットが最も高いキューである理由です.
    まとめ:
  • 容量なし
  • スループットはArrayBlockingQueueとLinkedBlockingQueueより
  • 高い
  • フェアポリシー
  • に参加可能
  • 挿入時に放出可能な異常動作
  • が提供する.
  • 挿入要素は空ではありません