Java队列Queue
队列Queue是一个先进先出的数据结构;与list、set同一级别,继承了collection接口。
Queue的实现
阻塞队列(BolckingQueue)
非阻塞队列
阻塞队列(BolckingQueue)
一、插入与移除
1、插入
队列不满时可执行插入元素线程,直到队列满。
2、移除
队列不为空时都可移除,直到队列为空。
抛出异常:满的时候插入,空的时候取出都会抛出异常。
返回特殊值:插入成功返回true
一直阻塞:满时put和空时take会阻塞线程,直到队列可用。
二、JDK7提供了7个阻塞队列:
1、ArrayListBlockingQueue
ArrayBlockingQueue是一个由数组支持的有界阻塞队列。在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式。
2、LinkedBlockingQueue
一个由链表结构组成的双向阻塞队列。
基于链表的阻塞队列,内部维持着数据缓冲队列。当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;当队列缓冲区达到最大缓冲容量时,才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生成者线程才会被唤醒,反之对消费者的处理也基于同样的原理。
LinkedBlockingQueue之所以能够高效的处理并发数据,还因为其对于生产者和消费者分别采用了独立的锁来控制数据同步,也就意味着在高并发的情况下生产者和消费者可以并行的操作队列中的数据,以此来提高整个队列的并发性能。
3、SynchronousQueue
一个不存储元素的阻塞队列,在某次添加元素后必须等待其他线程取走后才能继续添加。
4、 PriorityBlockingQueue
是一个带优先级的队列,而不是先进先出队列,该队列也没有上限,但是如果队列为空,那么取元素的操作take就会阻塞。
5、DelayQueue
是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。
三、ArrayListBlockingQueue和LinkedBlockingQueue的区别?
1、队列中锁的实现不同
ArrayBlockingQueue生产者消费者使用同一个锁。
LinkedBlockingQueue生产用的是putLock,消费是takeLock。
2、在生产和消费时操作不同
ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的;
LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为节点进行插入或移除,会影响性能。
3、 队列大小初始化方式不同
ArrayBlockingQueue实现的队列必须指定大小
LinkedBlockingQueue可以不指定大小,默认是Integer.MAX_VALUE
ArrayBlockingQueue性能要比LinkedBlockingQueue性能要好,执行速度更快,ArrayBlockingQueue优先使用!
非阻塞队列
ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。
入队和出队都采用CAS(compare and set)更新,这样允许多个线程并发执行,并且不会因为加锁而阻塞线程,使得并发性能更好。
注:CAS用于实现多线程同步的原子指令,它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。
代码实例
package OSChina.Client;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BlockingQueueTest {
static final SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm:ss”);
//定义装苹果的篮子
public static class Basket{
// 篮子,能够容纳3个苹果
static BlockingQueue queue = new ArrayBlockingQueue(3);
//生产苹果,放入篮子
public void produce() throws InterruptedException{
queue.put(“An apple”);
}
// 消费苹果,从篮子中取走
public String consume() throws InterruptedException{
String apple = queue.take();
return apple;
}
public static int getAppleNumber(){
return queue.size();
}
}
public static void testBasket(){// 建立一个装苹果的篮子final Basket basket = new Basket();//定义苹果生产者class Producer implements Runnable{@Overridepublic void run() {try {while (true){System.out.println("生产者准备生产苹果:"+sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());basket.produce();System.out.println("生产者生产苹果完毕:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());Thread.sleep(300);}}catch (InterruptedException ex){}}}//定义苹果消费者class Consumer implements Runnable{@Overridepublic void run() {try {while (true){System.out.println("消费者准备消费苹果:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());basket.consume();System.out.println("消费完后有苹果:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());Thread.sleep(1000);}}catch (InterruptedException ex){}}}ExecutorService service = Executors.newFixedThreadPool(2);Producer producer = new Producer();Consumer consumer = new Consumer();service.submit(producer);service.submit(consumer);// 程序运行10s后,所有任务停止try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}service.shutdownNow();
}public static void main(String[] args) {BlockingQueueTest.testBasket();
}
}
————————————————
版权声明:本文为CSDN博主「GooReey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guorui_java/article/details/104109604
Java队列Queue相关推荐
- Java队列 Queue
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120828046 本文出自[赵彦军的博客] Java队列 Queue Java队列 ...
- java lifo 队列_1.8 Java 队列 Queue、双端队列 Deque - Java 知识总结与学习
queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.除了基本的 Collection 操作外,队列还 ...
- java队列——queue详细分析
Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口. Q ...
- java队列queue的我觉得很好的使用方式
LinkedList实现了queue接口,通常使用LinkedList 其中关键两个函数:offer().poll() offer()表示"排队"----插入到队列最前,poll( ...
- Java队列Queue的使用
首先我们需要知道使用队列是什么,以及使用队列的意义. 一个队列基本上可以认为是一个先入先出(FIFO)的数据结构,队列和数组的主要区别就在于,我们在使用数组时,必须在前面就定义好数组的长度,这就有了很 ...
- Java队列Queue使用详解(*)
Queue是java中实现队列的接口,它总共只有6个方法,我们一般只用其中3个就可以了.Queue的实现类有LinkedList和PriorityQueue.最常用的实现类是LinkedList. Q ...
- 【Java】Java队列Queue使用详解
Deque是一个双端队列接口(double ended queue),继承自Queue接口,Deque的实现类是LinkedList.ArrayDeque.LinkedBlockingDeque,其中 ...
- java队列(Queue)用法总结
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.队列的特点 队列是一种比较特殊的线 ...
- 中高级工程师Java开发!java队列queue实现
主要内容 本文是从大型互联网系统的应用角度探讨分布式缓存的.本文站在原理.框架.架构.案例等多个视角对分布式缓存进行了探讨. 互联网系统随着容量需求的陡增,许多看似简单的存储类场景都面临着巨大的容量问 ...
最新文章
- Docker学习(六)-----Docker数据卷
- JS传中文到后台需要的处理
- 基于FPGA的前向纠错算法
- CSS——Fonts(字体)
- RESTful测试工具RESTClient
- 机器视觉:远心镜头使用规则
- dp hp oracle 备份软件_HPDP备份软件设置
- python读二进制文件遍历_使用python反向读取二进制文件
- 7-3 判断素数 (10 分)
- android获取手机短信记录,Android开发获取短信的内容并截取短信
- excel TEXT 函数
- 如何利用小红书进行产品营销?小红书营销技巧有哪些?
- 垂直领域知识图谱_垂直知识图谱的构建与应用研究
- Mysql出现问题:ERROR 10055:Lost connection to MySQL server at ‘reading initial communication packet‘解决方案
- 用 Python 自动生成数据日报!
- kurento API解读
- 合并 多个pdf文件_如何在多个子文件夹中合并合并PDF文件
- SAP ABAP 查找更改文档对象(SCDO)和表关系的在线字典1/2(全)
- 高清电视HDTV概述
- 机器学习实验大作业:Yolov5s交通标志检测
热门文章
- asp.net html helper,6. ASP.NET MVC 5.0 中的HTML Helper【HTML 帮助类】
- (三)重构ResNet50以诊断COVID-19
- Core 3.1中的应用程序设置如何在多环境场景中工作
- 为何要搞 10 年?方舟编译器专家首次回应
- 程序在发布前就应该发现的一些错误
- mybatis-generator配置流程(详细) 2021-05-15
- java反汇编pdf_java反汇编探究(1)---javap.exe (转自高山仰止百度空间)
- 小程序分类左右内容联动
- docker run后台启动命令_Docker命令-docker run
- or计算机二级,计算机二级VF历年上机试题or答案