首页 > 编程语言 >Java集合——Queue详解

Java集合——Queue详解

时间:2024-09-10 21:23:21浏览次数:13  
标签:Java 队列 元素 阻塞 Queue 插入 详解 线程 SynchronousQueue

Queue详解

基本概念

  • Java 中的 Queue 接口表示一种先进先出(FIFO, First In First Out)的数据结构,但实际上它也支持其他插入和删除策略。
  • Queue 是 Java 集合框架的一部分,它继承自 Collection 接口,并且定义了许多用于队列操作的方法。

功能分类

在这里插入图片描述

  • 双端队列:继承 Deque 接口的队列,支持从两端插入和移除元素。ArrayDequeLinkedList 都是 Deque 的实现类,可以用来创建栈或双端队列。

  • 阻塞队列:继承BlockingQueueBlockingDeque 接口的队列,当队列满或空时,插入或移除操作将会阻塞的队列。阻塞队列都是线程安全的。例如,ArrayBlockingQueueLinkedBlockingQueue 等。

  • 并发队列:在多线程环境中,使用普通的队列实现可能会导致数据不一致或竞争问题。Java 提供了线程安全的并发队列,ConcurrentLinkedQueueConcurrentLinkedDequeBlockingQueue

  • 有界队列:如 ArrayBlockingQueue 可以设置一个最大容量,当队列达到这个容量时,将不再接受新的元素插入,除非有其他元素被移除。

  • 无界队列:一些队列实现没有固定的容量限制,如 LinkedListArrayDeque

  • 优先队列PriorityQueuePriorityBlockingQueue ,根据元素的自然顺序或通过提供的 Comparator 来确定元素插入位置,队列内元素有序排列。当从队列中移除元素时,总是返回具有最高优先级的元素。

  • 延迟队列DelayQueue继承子 BlockingQueue,它允许元素在被添加时指定一个延迟时间。只有当这个延迟时间过去之后,元素才会变得可见。延迟队列中元素是按照延迟时间排序的,因此内部元素需要实现Delayed接口,其中compareTo方法,用于队列元素排序。延迟队列通常用于实现定时任务或事件调度等功能。

  • 同步队列SynchronousQueue 继承自 BlockingQueue,用于在线程之间直接传递元素。它没有内部缓冲区,也就是说它不能存储任何元素。因此,当一个线程试图向 SynchronousQueue 插入一个元素时(例如使用 put 方法),它会一直阻塞,直到另一个线程从队列中取出这个元素(例如使用 take 方法)。常用于生产者消费者模式。

主要方法

普通队列

操作抛出异常返回特殊值
插入add(e)offer(e)
删除remove()poll()
检查element()peek()

当队列为空或容量已满时,removeelementadd方法会抛出异常,而pollpeekoffer方法则会返回falsenull

双端队列

操作方法
尾部插入(队列)offer(e)
头部删除(队列)poll()
尾部插入(栈)push(e)
尾部删除(栈)pop()

既支持队列相关操作,也支持栈相关操作

阻塞队列

操作方法
插入put(e)
删除take()

阻塞队列中的puttake方法有阻塞特性,而offerpoll方法无阻塞特性,是非阻塞方法


使用示例

以下是一个使用 SynchronousQueue 的生产者消费者模式示例:

package leetcode.editor.cn;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

public class SynchronousQueueExample {

    public static void main(String[] args) throws InterruptedException {
        /**
         * 创建一个非公平模式的 SynchronousQueue
         * 若队列中没有元素,当两个线程同时请求,优先插入操作
         * 若队列中已有元素,当两个线程同时请求,优先删除操作
         */
        SynchronousQueue<Integer> queue = new SynchronousQueue<>(false);

        Thread producerThread = new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    System.out.println("Producer putting " + i);
                    queue.put(i);
                    TimeUnit.MILLISECONDS.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread consumerThread = new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    Integer value = queue.take();
                    System.out.println("Consumer taking " + value);
                    TimeUnit.MILLISECONDS.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producerThread.start();
        consumerThread.start();
        
        producerThread.join();
        consumerThread.join();
    }
}

总结

实际常用的是LinkedListArrayDeque,既可以作为队列使用,也可以作为栈使用

标签:Java,队列,元素,阻塞,Queue,插入,详解,线程,SynchronousQueue
From: https://blog.csdn.net/yang_brother/article/details/142103106

相关文章

  • java毕业设计-基于springboot+vue的校园大学生兼职系统设计和实现,基于springboot的大
    博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • 【Linux进程详解】进程地址空间
    目录1.直接写代码看现象2.引入最基本的理解3.细节问题-理解它1.直接写代码看现象#include<stdio.h>#include<string.h>#include<unistd.h>#include<stdlib.h>#include<unistd.h>intg_val=100;intmain(){printf("fatherisrunning,pid:%d,......
  • 【待做】【JavaWeb】HTTP、Tomcat、Servlet
    一、JavaWeb框架及HTTP介绍二、IDEA+Tomcat集成快速构建JavaWeb项目2.1快速构建JavaWeb项目2.2IDEA集成本地Tomcat2.3IDEA配置Tomcat的Maven插件2.4项目打包后的目录结构三、Servlet执行流程及生命周期介绍3.1Servlet介绍及写个接口3.2Se......
  • Java实现英语作文单词扫盲程序
    来自背英语四级单词的突发奇想:是否可以通过Java语言实现一个随机抽取作文中单词进行复习的程序。首先,展示下成果:点击查看代码packageDemo;importjava.util.ArrayList;importjava.util.Random;importjava.util.Scanner;publicclassrandom_words{publicstati......
  • 【AI绘画】Midjourney光影控制详解
    博客主页:[小ᶻZ࿆]本文专栏:AI绘画|Midjourney文章目录......
  • select函数详解:IO复用
    select函数概述select函数是一种用于实现I/O复用的方法,它可以让程序在多个文件描述符(例如套接字)之间进行选择,以便在其中任何一个或多个可用时执行I/O操作。这种机制使得程序能够更高效地处理多个I/O操作。下面将对select的原理和工作机制进行详细介绍,并分析select函数的优势和......
  • 【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?
    【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?场景一、JAVA程序中某个线程占用CPU飙高,问题定位top、jstack命令的使用四步教你快速定位问题代码1.top命令获取异常的java进程PID   top2.查询异常进程中的线程情况,获取异常......
  • FreeSwitch之TTS 对接paddlespeech (windowsJava版)
    本来计划FreeSwitch通过tts_commandline对接第三方语音合成,但是由于在家安装的是windows版本,系统安装后mod缺少commandline模版,所以导致无法使用该模版。系统自带的TTS引起filter效果非常差,且不支持中文语音合成,导致在测试的过程中很多工作进行不下去。家里的电脑是windows10......
  • PaddleSpeech TTS API与流式速度对比(windows Java版)
    首先本地环境要安装部署PaddleSpeech语音识别系统,参考Windows10系统部署PaddleSpeech本地部署好后,根据官方文档启动TTS的流式服务,参考PaddleSpeech语音启用流式服务1、相关服务的启动 1.1本机启动TTSAPI服务paddlespeech_serverstart--config_file./demos/speech_ser......
  • 欢迎来到我的Java世界“抽象类”
    前言在上篇中我们学习到了继承的概念、语法等等,那么小编将来为大家方享下一篇Java中的抽象类。1.抽象类的概念2.抽象类的语法3.抽象类的特性4.抽象类的作用一:讲到抽象类,大家是不是会很迷惑什么是抽象类?在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并......