面試刷題21:java並發工具中的隊列有哪些?
- 2020 年 3 月 30 日
- 筆記

java的執行緒池的工作隊列用到了並發隊列。
隊列一般用在生產者消費者的場景中,處理需要排隊的需求。
你好,我是李福春,今天的問題是:
ConcurrentLinkedQueue和LinkedBlockingQueue有什麼區別?
答:都是java提供的並發安全隊列,都提供了等待性的操作,take,put 區別如下:
並發隊列類層級
層級圖如下:
生產者消費者例子
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提供的隊列層級。
通過一個簡單的生產者消費者例子展示了隊列的基本使用。
最後介紹了不同場景下隊列的選擇。
原創不易,轉載請註明出處。