Java並行プログラミングツールJUCパート2:ArrayBlockingQueue

このクラスArrayBlockingQueueBlockingQueue、インターフェイスの実装クラスです。これは、制限付きのブロッキングキューであり、配列を使用してキュー要素を内部に格納しますここでいう「有界」とは、保存容量に上限があり、要素を無限に保存できないことを意味します。同時にストレージ容量の上限があります。この上限は最初のインスタンス化時に指定され、後で変更することはできません。

ArrayBlockingQueueFIFO(First In、First Out)メソッドは、キューデータへのアクセスを実現するために内部的に使用されます。キューの先頭にある要素は、キュー内の保存時間が最も長い要素オブジェクトであり、キューの最後にある要素です。キュー内の最短の保存時間です。要素オブジェクト。

次のコードは、1つを初期化しArrayBlockingQueue、それにオブジェクトを追加する方法を示しています。

BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //向队列中添加元素
Object object = queue.take();   //从队列中取出元素

BlockingQueueジェネリックを使用して、キューに格納されるデータのタイプを制限できます。次のコードでは、ジェネリックとして文字列を使用しています。つまり、キューは文字列タイプのみを格納できます。

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();

生産と消費のインスタンスを実現する

前回の記事では、次のことについて説明しました。BlockingQueueは、バッファーキューを生成および消費するためによく使用されます。以下では、それArrayBlockingQueue使用して、生産と消費の例を実際に実現します。

クラスBlockingQueueExampleは2つの独立したスレッドを開きます。1つはProducerキューへのデータの追加を担当するプロデューサースレッドで、もう1つはConsumer処理のためにキューからデータを削除する責任を負うコンシューマースレッドです。

public class BlockingQueueExample {

    public static void main(String[] args) throws Exception {
        //使用ArrayBlockingQueue初始化一个BlockingQueue,指定容量的上限为1024
        BlockingQueue queue = new ArrayBlockingQueue(1024);

        Producer producer = new Producer(queue);  //生产者
        Consumer consumer = new Consumer(queue);  //消费者

        new Thread(producer).start();  //开启生产者线程
        new Thread(consumer).start();  //开启消费者线程

        Thread.sleep(4000);
    }
}

クラスProducerはプロデューサーでありput()、オブジェクトは10秒ごとにメソッドを使用してキューに入れられ、3回入れられます。この10秒の間隔では、キューデータがコンシューマーによって削除された後、コンシューマースレッドがブロックされます。

public class Producer implements Runnable{

    protected BlockingQueue queue = null;

    public Producer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            queue.put("1");
            Thread.sleep(10000);
            queue.put("2");
            Thread.sleep(10000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

次のコードはコンシューマークラスConsumerであり、キューから処理される要素オブジェクトを取得し、System.outそれを出力するために呼び出します

public class Consumer implements Runnable{

    protected BlockingQueue queue = null;

    public Consumer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上記のコードは、結果が10秒に1回出力されることを出力しtake()ます。これは、コンシューマーが現在のスレッドをブロックするときにメソッドが実行される要素がないため、キュー内で待機状態にあるためです。このメソッドは、前のセクションで紹介しました。BlockingQueueのそれはその時にすでに説明されています。

私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります

  • この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ

あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。

おすすめ

転載: blog.csdn.net/hanxiaotongtong/article/details/115107810