並行性Pratice(一:BlockingQueueの)

Java java.util.currencyパッケージのBlockingQueueインタフェースは、スレッドがキューにオブジェクトを追加して抽出できることを意味します。次の段落では、我々が使用する方法を学びますBlockingQueueインターフェイスを。

BlockingQueueの使用

BlockingQueueの典型的なアプリケーションでは、スレッド、別のスレッドの消費者のためのオブジェクトの生成です。

以下では、図の概略説明です。

キューにオブジェクトを追加するためのスレッドを伴うブロッキングキュー、キューからオブジェクトを抽出するために別のスレッド。

生産同時スレッドがキューが保持できる境界値に到達するまでキューにに追加された新しいオブジェクトの生産のための責任がある。それは容量制限である。キューが容量の限界に達した場合は、新しいオブジェクトを挿入すると、スレッドの生成をブロックするまでは。どうなりますオブジェクトまでの消費者のスレッドがキューから削除されます。

消費者スレッドはキューをブロックし、それらを処理からオブジェクトを削除する責任がある。あなたは空のキューから空のキューの消費者のスレッドを削除しようとすると、スレッドはキューオブジェクトを設置するために、消費者のスレッド生産までブロックします。

BlockingQueueの方法

ブロッキングキューはキューに挿入行うための方法の4つの異なるセットが含まれ、そして要素をチェック除去される。これは、動作要求の異なる挙動の各セットは、これらの方法の直後に実行することができないという点で異なりますリスト:

例外をスローします 特別な値 ブロック タイムアウト
インサート 追加(O) プラン(O) 置く(O) オファー(O、タイムアウト、時間単位)
取り除きます (O)削除 世論調査() 取る() 世論調査(タイムアウト、TIMEUNIT)
検査します 素子() ピーク()

次の行動の4つの異なる組み合わせ:

  1. 例外をスロー:試みる操作はすぐに実行できない場合は、例外がスローされます
  2. 特別な値:トライ操作はすぐに実行できない場合、戻り値を指定する(通常は真/偽)
  3. ブロック:しようとする操作はすぐに実行できない場合は、成功するまで行うことが可能な方法をブロック呼び出します
  4. タイムアウト:しようとする操作はすぐに実行できない場合、あなたはそれが成功する実行可能になるまで、ブロックする方法は呼び出しますが、(この典型的な例は、真であるにかかわらず、成功したか、指定された値を返すに失敗し、超えた場合に長い待ち時間が指定されたタイムアウト時間を超えてはなりません。.. /偽)

挿入することができませんnullでのBlockingQueueに。あなたはそれを行う場合は、BlockingQueueのがスローされますNullPointerException

もちろん、私たちは、たとえば、あなたがオブジェクトの実装のためのチームを必要としています。また、すべての要素BlockingQueueのだけでなく、チームのヘッドとテールにアクセスすることができますが、それはあなたのアプリケーションを中止することを決定した。あなたはまだ同様の削除(O)メソッドを使用できるようにキュー指定されたオブジェクトを削除します。しかし、これは非常に効率的ではありませんので、あなたが本当にそうする必要がない限り、あなたは、このような方法を使用しないでください。

BlockingQueueの各種の実現

BlockingQueueのちょうどインターフェースなので、あなたはそれを使用するために実装され、その多くのものを使用する必要があります。java.util.concurrencyパッケージ(Java6の中に)いくつかのBlockingQueueインタフェースがあります。

  • ArrayBlockingQueue
  • DelayQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue
  • SynchronousQueue

JavaのBlockingQueueの例

以下はArrayBlockingQueue、インタフェースを実装するJava BlockingQueueの。BlockingQueueの例のクラスの例です。

まず、BlockingQueueExampleクラスは、生産と消費の開始はスレッドです。消費者のスレッドがそれらの除去のための責任があるのに対し、スレッドは、共有のBlockingQueueに挿入された生産文字列を担当しています。

public class ArrayBlockingQueueExample {
    public static void main(String[] args) {
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1024);
        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);

        new Thread(producer).start();
        new Thread(consumer).start();

        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

ここでプロデューサーのカテゴリは)私たちは一度の呼び出しを(置くことに注意してください。あるスレッドが1秒間スリープ状態にできるようになります。これは、消費者のスレッドがキュー内のオブジェクトを待つ際に閉塞が起こる原因となります。

public class Producer implements Runnable {
    private ArrayBlockingQueue<String> queue;

    public Producer(ArrayBlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            queue.put("1");
            Thread.sleep(1000);
            queue.put("2");
            Thread.sleep(1000);
            queue.put("3");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

以下は、消費者のクラスである。これは、文字列キューから削除し、System.outにプリントアウトのための唯一の責任です。

package org.menfre;

import java.util.concurrent.ArrayBlockingQueue;

public class Consumer implements  Runnable {
    private ArrayBlockingQueue<String> queue;

    public Consumer(ArrayBlockingQueue<String> queue){
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

私たちはヤコブJenkovによって書かれたオリジナルのレビューから、見直しや基本的な書かれた翻訳を理解した後、製品のこのブログシリーズjava.util.concurrentの

次へ:ArrayBlockingQueue

おすすめ

転載: juejin.im/post/5cf548aef265da1bb2771b0d