面试刷题21:java并发工具中的队列有哪些?
2024-09-05 21:10:54
![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.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<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提供的队列层级。
通过一个简单的生产者消费者例子展示了队列的基本使用。
最后介绍了不同场景下队列的选择。
原创不易,转载请注明出处。
最新文章
- Atitit 多元化战略 适合我们发展 的核心业务attilax总结
- SQL Server 跨网段(跨机房)复制
- SuperMap iServer 扩展服务及扩展服务提供者范例
- python 下 tinker、matplotlib 混合编程示例一个
- Excel里内嵌在线翻译
- 【C++】【斐波那契】求第几个斐波那契数字。
- Android调用.net的webservice服务器接收参数为空的情况
- 深入理解object C中复制对象的用法(二)
- c语言中的#ifndef、#def、#endif等宏是什么意思
- Problem D Ananagrams(map的使用)
- ok6410 u-boot-2012.04.01移植二修改源码支持单板
- Xcode使用心得01:断点中断问题和调整编译目标
- 精彩源于起点——2018年潍坊市首次青少年Python编程公开课
- error: each element of &#39;ext_modules&#39; option must be an Extension instance or 2-tuple
- PAT Basic 1065 单身狗
- C# 线程 正确使用Thread.Join()停止方式
- 做到让DBCP连接池不超时
- functions文件详细分析和说明
- Excel两列查找重复值
- MapReduce 过程详解
热门文章
- 5G-NR物理信道与调制-下行链路v1.1.0
- [Python_scrapy图片爬取下载]
- hihoCoder 1128 二分查找
- HTML标签学习总结(1)
- [ASP.NET Core 3框架揭秘] 服务承载系统[1]: 承载长时间运行的服务[上篇]
- JUC-八锁现象和不安全锁
- 在centos7使用docker下搭建elasticsearch集群
- spring boot 过滤器 前后端分离跨域sessionId不一致
- 《JavaScript 模式》读书笔记(1)— 简介
- C#桌面开发的未来WebWindow