ブラシインタビューの質問21:どのようなキューのJava並行処理ユーティリティ?


![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png)

作業キュースレッドプールのJavaは、同時キューを使用しています。
キューは、一般生産者-消費者のシナリオで使用され、プロセスが並んで待つ必要があります。


こんにちは、私は李富春よ、今日の質問は次のとおりです。

ConcurrentLinkedQueueとLinkedBlockingQueue違いは何ですか?


A:同時キューの安全性は、Javaを提供しているが、待って、テイクの操作を提供し、プットの違いは次の通りです:

ファイル

同時キュークラス階層


次のようにレベルは以下のとおりです。

image.png


消費者の例プロデューサー

package org.example.mianshi.queue;

import java.util.Objects;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.stream.IntStream;

/**
 * 作者:     carter
 * 创建日期:  2020/3/30 17:39
 * 描述:     生产者消费者例子
 */

public class ConsumerProduceApp {

    public static void main(String[] args) {

        BlockingQueue<String> queue = new ArrayBlockingQueue<>(1000);

        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);

        producer.start();
        consumer.start();

        try {
            producer.join();
            consumer.join();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public static class Consumer extends Thread {

        private BlockingQueue<String> blockingQueue;

        public Consumer(BlockingQueue<String> blockingQueue) {
            this.blockingQueue = blockingQueue;
        }

        @Override
        public void run() {

            String msg = "";
            do {
                try {
                    msg = blockingQueue.take();

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(msg);

            } while (!Objects.equals(msg, "quit"));

        }
    }

    public static class Producer extends Thread {

        private BlockingQueue<String> blockingQueue;

        public Producer(BlockingQueue<String> blockingQueue) {
            this.blockingQueue = blockingQueue;
        }

        @Override
        public void run() {

            IntStream.rangeClosed(1, 100)
                    .forEach(i -> {
                        try {
                            blockingQueue.put("msg" + i);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    });

            try {
                blockingQueue.put("quit");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}


有界キュー:

持つArrayBlockingQueue:固定容量、連続したメモリ・キュー

LinkedBlockingQueue:有界キューのサイズが提供されていない設定が無制限キューた

SychronousQueue:容量は0、テイクでは、操作は各待機入れ


:無制限キュー

優先度つきキュー:優先無制限キュー

DelayedQueueました:遅れアンバウンド形式のキュー

キューを選択



有界かどうかに応じて:一般ArrayBlockingQueue、LinkedBlockingQueueを選択 

メモリ気密性に従って:ArrayBlockingQueue

スループットによると:LinkedBlockingQueueを

リレー以下のスレッドキュー情報ハイパフォーマンス:SynchronouseQueue


概要


このセクションでは、ConcurrentBlockingQueueとLinkedBlockingQueue差は、キューレベルのJavaプランを見直し、大きな機会を提供します。


消費者の簡単な例の生産者は、キューの基本的な使用方法を示します。


最後に、異なるシナリオの下でキューの選択。





image.png

元は容易ではない、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/snidget/p/12600362.html