面試刷題21:java並發工具中的隊列有哪些?

  • 2020 年 3 月 30 日
  • 筆記

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

java的執行緒池的工作隊列用到了並發隊列。
隊列一般用在生產者消費者的場景中,處理需要排隊的需求。

你好,我是李福春,今天的問題是:

ConcurrentLinkedQueue和LinkedBlockingQueue有什麼區別?

答:都是java提供的並發安全隊列,都提供了等待性的操作,take,put 區別如下:

file

並發隊列類層級

層級圖如下:

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, take,put操作互相等待

無界隊列:

PriorityQueue: 優先順序無界隊列

DelayedQueue: 延遲無界隊列

隊列的選擇

按照是否有界: 一般選擇ArrayBlockingQueue , LinkedBlockingQueue 

按照記憶體緊密性: ArrayBlockingQueue

按照吞吐量:LinkedBlockingQueue

執行緒接力或者隊列資訊較少的高性能: SynchronouseQueue

小結

本節機會大了ConcurrentBlockingQueue和LinkedBlockingQueue的區別,然後回顧了java提供的隊列層級。

通過一個簡單的生產者消費者例子展示了隊列的基本使用。

最後介紹了不同場景下隊列的選擇。

image.png

原創不易,轉載請註明出處。