博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试刷题21:java并发工具中的队列有哪些?
阅读量:4211 次
发布时间:2019-05-26

本文共 2794 字,大约阅读时间需要 9 分钟。

![image.png](https://img-blog.csdnimg.cn/20200330183753183.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
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(); } } }}
有界队列:
ArrayBlockingQueue: 容量固定,内存连续队列
LinkedBlockingQueue : 设置大小为有界队列,不设置则为无界队列
SychronousQueue: 容量为0, take,put操作互相等待
无界队列:
PriorityQueue: 优先级无界队列
DelayedQueue: 延迟无界队列

队列的选择

按照是否有界: 一般选择ArrayBlockingQueue , LinkedBlockingQueue 
按照内存紧密性: ArrayBlockingQueue

按照吞吐量:LinkedBlockingQueue

线程接力或者队列信息较少的高性能: SynchronouseQueue

小结

本节机会大了ConcurrentBlockingQueue和LinkedBlockingQueue的区别,然后回顾了java提供的队列层级。
通过一个简单的生产者消费者例子展示了队列的基本使用。
最后介绍了不同场景下队列的选择。
image.png

原创不易,转载请注明出处,让我们互通有无,共同进步,欢迎多沟通交流

你可能感兴趣的文章
Linux学习记录--开机挂载错误
查看>>
Linux学习记录--程序编译与函数库
查看>>
Linux学习记录--软件安装RPM|SRPM|YUM
查看>>
Linux学习记录--内核|内核模块编译
查看>>
Linux学习记录--文件管理相关系统编程
查看>>
Linux学习记录--进程控制相关系统调用
查看>>
Linux学习记录--匿名管道通讯
查看>>
Linux学习记录--有名管道通信
查看>>
内存(字节)对齐
查看>>
Linux学习记录--文件IO操作相关系统编程
查看>>
QSS知识总结
查看>>
C语言编译原理
查看>>
如何创建可执行程序
查看>>
Jenkins配置基于角色的项目权限管理
查看>>
Jenkins-Email Extension Plugin
查看>>
Jenkins—Jenkins是什么
查看>>
Jenkins系列—安装与配置
查看>>
读写CSV文件
查看>>
通过SMTP发邮件
查看>>
读写EXCEL
查看>>