Java Queue Interfaceのガイド

1. 前書き

このチュートリアルでは、Javaの_Queue_インターフェイスについて説明します。
最初に、_Queue_の機能と、そのコアメソッドの一部を使用します*。 次に、Javaが標準として提供する多くの*実装に飛び込みます*。
最後に、すべてをまとめる前にスレッドセーフについて説明します。

2. キューの視覚化

簡単な例えから始めましょう。
最初のビジネス、つまりホットドッグスタンドをオープンしたばかりだと想像してください。 私たちは、中小企業にとって可能な限り最も効率的な方法で、新しい潜在顧客にサービスを提供したいと考えています。一つずつ。 最初に、スタンドの前に整然としたラインを形成するように依頼し、新しい顧客が後部に参加します。 組織力のおかげで、おいしいホットドッグを公平に配布できるようになりました。
__Queues __in Javaも同様に機能します。 __Queueを宣言したら、___は新しい要素を背面に追加し、前面から削除できます。
実際、Javaでの* most __Queues ___は、この先入れ先出し*の方法(多くの場合、FIFOと略されます)で遭遇します。
ただし、リンク:#priority_queues [later]に触れる例外が1つあります。

3. コアメソッド

__Queue __declaresは、すべての実装クラスでコーディングする必要があるhttps://docs.oracle.com/javase/7/docs/api/java/util/Queue.html [メソッドの数]を宣言します。 *もっと重要なものをいくつか紹介しましょう* *今すぐ*:
  1. * offer() * –新しい要素を_Queue_に挿入します

  2. _ * poll()*_– _Queue_の前から要素を削除します

  3. _ * peek()* – の前にある要素を検査します
    Queue、__削除せずに

4. AbstractQueue

__https://docs.oracle.com/javase/7/docs/api/java/util/AbstractQueue.html [AbstractQueue] __は、Javaが提供する*可能な限り単純な__Queue ___実装です。 _https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html#offer(E)[offer] _を除く__interfaceのメソッド。
*カスタムキューを作成するときは、_AbstractQueue_ class _、_ *を拡張して、実装を提供する必要があります。
さらに、* _peek、poll、size、_および_java.util_‘s _iterator _。*メソッドを提供する必要があります。
  • AbstractQueue._を使用して、簡単なQueue implementation *を組み立てましょう。

    まず、__LinkedList ___を使用してクラスを定義し、__Queueの____elementsを保存します。
public class CustomBaeldungQueue<T> extends AbstractQueue<T> {

    private LinkedList<T> elements;

    public CustomBaeldungQueue() {
      this.elements = new LinkedList<T>();
    }

}
次に、*必要なメソッドをオーバーライドし、コードを提供しましょう:*
@Override
public Iterator<T> iterator() {
    return elements.iterator();
}

@Override
public int size() {
    return elements.size();
}

@Override
public boolean offer(T t) {
    if(t == null) return false;
    elements.add(t);
    return true;
}

@Override
public T poll() {
    Iterator<T> iter = elements.iterator();
    T t = iter.next();
    if(t != null){
        iter.remove();
        return t;
    }
    return null;
}

@Override
public T peek() {
    return elements.getFirst();
}
すばらしい、簡単な単体テストで動作することを確認しましょう。
customQueue.add(7);
customQueue.add(5);

int first = customQueue.poll();
int second = customQueue.poll();

assertEquals(7, first);
assertEquals(5, second);

4. サブインターフェース

通常、__Queue __interfaceは、* 3メインサブインターフェース* _Blocking Queues、Transfer Queues_、および_Deques_によって継承されます。
これら3つのインターフェイスは、Javaで利用可能な大多数の_Queues._によって実装されます。これらのインターフェイスの目的を簡単に見てみましょう。

4.1. ブロッキングキュー

__https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html [BlockingQueue] __interface **スレッドを** __ * Queue *で待機させる追加操作をサポート__現在の状態に依存。 スレッドは、取得しようとするときに空にならないように、または新しい要素を追加するときに空になるために、__Queue __を待つことができます。
Standard _Blocking Queues_には__LinkedBlockingQueue、https://www.baeldung.com/java-synchronous-queue [SynchronousQueue、] __and _ArrayBlockingQueue_が含まれます。
詳細については、link:/java-blocking-queue[_Blocking Queues_]に関する記事をご覧ください。

4.2. 転送キュー

__https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TransferQueue.html [TransferQueue] __interfaceは、__BlockingQueue __interfaceを拡張しますが、*生産者/消費者パターン向けに調整されています。 生産者から消費者への情報の流れを制御し、システムにバックプレッシャーを作成します。*
Javaには、__TransferQueue ___interface、_https://www.baeldung.com/java-transfer-queue [LinkedTransferQueue] ._の1つの実装が付属しています。

4.3. Deques

_Deque_は** D ** ouble-** E ** nded _ ** Que ** ue_の略で、カードのデッキに似ています。要素は_Deque_の開始と終了の両方から取得できます。 従来の_Queueと同様に、_ * __ Deque ___providesメソッドは、上部と下部の両方に保持されている要素を追加、取得、および覗きます__.__ *
__Deque ___worksの詳細なガイドについては、link:/java-array-deque[_ArrayDeque _] link:/java-array-deque [article]をご覧ください。 。

5. Priority Queues

Javaで出会うほとんどの__Queues ___は、FIFOの原則に従っていることを以前に見ました。
このルールの例外の1つは、https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html [_PriorityQueue_]です。 *新しい要素が_PriorityQueueに挿入されると、それらは自然な順序に基づいて、または定義されたlink:/java-comparator-comparable[_Comparator_]*によって順序付けられます。
これが単純な単体テストでどのように機能するかを見てみましょう。
PriorityQueue<Integer> integerQueue = new PriorityQueue<>();

integerQueue.add(9);
integerQueue.add(2);
integerQueue.add(4);

int first = integerQueue.poll();
int second = integerQueue.poll();
int third = integerQueue.poll();

assertEquals(2, first);
assertEquals(4, second);
assertEquals(9, third);
整数が_PriorityQueue_に追加された順序にもかかわらず、*検索順序は数値の自然な順序に従って変更されることがわかります*。
同じことが_Strings_に適用された場合にも当てはまることがわかります。
PriorityQueue<String> stringQueue = new PriorityQueue<>();

stringQueue.add("blueberry");
stringQueue.add("apple");
stringQueue.add("cherry");

String first = stringQueue.poll();
String second = stringQueue.poll();
String third = stringQueue.poll();

assertEquals("apple", first);
assertEquals("blueberry", second);
assertEquals("cherry", third);

6. スレッドセーフ

_Queues_にアイテムを追加することは、マルチスレッド環境で特に役立ちます。 A * __ Queue __はスレッド間で共有でき、スペースが利用可能になるまで進行をブロックするために使用できます*-いくつかの一般的なマルチスレッドの問題を克服するのに役立ちます*
たとえば、複数のスレッドから単一のディスクに書き込むと、リソースの競合が発生し、書き込み時間が遅くなる可能性があります。 * __BlockingQueue ___を使用して単一のライタースレッドを作成すると、この問題を軽減し、書き込み速度を大幅に向上させることができます。*
幸運なことに、Javaは_ConcurrentLinkedQueue、ArrayBlockingQueue_、および__ConcurrentLinkedDeque __を提供しています。これらはスレッドセーフであり、マルチスレッドプログラムに最適です。

7. 結論

このチュートリアルでは、Java __Queue ___interfaceについて詳しく説明しました。
まず、Javaが提供する実装だけでなく、a__Queue that ___ does *を調査しました。
次に、通常のFIFOの原理である__Queue '__ sと、順序が異なる__PriorityQueue __を見てみました。*
最後に、*スレッドの安全性*と、マルチスレッド環境での__Queues __の使用方法を調査しました。
いつものように、コードはlink:#[GitHub]で入手できます。