本文共 2794 字,大约阅读时间需要 9 分钟。
![image.png](https://img-blog.csdnimg.cn/20200330183753183.png) 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有界队列: ArrayBlockingQueue: 容量固定,内存连续队列 LinkedBlockingQueue : 设置大小为有界队列,不设置则为无界队列 SychronousQueue: 容量为0, take,put操作互相等待 无界队列: PriorityQueue: 优先级无界队列 DelayedQueue: 延迟无界队列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 blockingQueue; public Consumer(BlockingQueue 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 blockingQueue; public Producer(BlockingQueue 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(); } } }}
按照吞吐量:LinkedBlockingQueue
线程接力或者队列信息较少的高性能: SynchronouseQueue
原创不易,转载请注明出处,让我们互通有无,共同进步,欢迎多沟通交流