`

队列与Java基础类的队列实现,以及优缺点

阅读更多

1.队列的基本知识

 

和栈相反,队列是一种先进先出(First In First Out,缩写为FIFO)的线性表,它只允许一端进行插入,而在另外一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫做队尾(rear),允许删除的一端称之为队头(front)。

 

 

 

 

2.队列的基本操作

InitQueue:构造一个空队列

DestroyQueue:销毁队列

ClearQueue:清空队列

QueueEmpty:判断队列是否为空

QueueLength:队列长度

GetHead:获取队列头部元素

EnQueue:入列

DeQueue:出列


3.java中阻塞队列 - ArrayBlockingQueue 的实现

 

阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。

 

利用数组来实现阻塞队列

 

/**

*初始化一个长度为capacity的数组

*采用非公平策略:让线程自由竞争锁,不保证等待最长的线程优先获取锁

*采用公平策略:让等待时间最长的线程优先获取锁

*/

 public ArrayBlockingQueue(int capacity) {
        this(capacity, false);
    }

 

/**

*出列:

*将数组的中第一个有值的元素至空

*如果数组元素的实际长度为0,则等待

*直到获得通知

*/

public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            try {
                while (count == 0)
                    notEmpty.await();
            } catch (InterruptedException ie) {
                notEmpty.signal(); // propagate to non-interrupted thread
                throw ie;
            }
            E x = extract();
            return x;
        } finally {
            lock.unlock();
        }
    }

 

/**

*入列:

*将新的元素插入队尾

*如果队列已满,则等待

*

*/

public void put(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        final E[] items = this.items;
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            try {
                while (count == items.length)
                    notFull.await();
            } catch (InterruptedException ie) {
                notFull.signal(); // propagate to non-interrupted thread
                throw ie;
            }
            insert(e);
        } finally {
            lock.unlock();
        }
    }

 

/**

*获取队列头元素

*

*/

public E peek() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            return (count == 0) ? null : items[takeIndex];
        } finally {
            lock.unlock();
        }
    }

 

/*

*获取队列长度

*

*/

 public int size() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }


4.Sample

 

  • 大小: 23.8 KB
分享到:
评论

相关推荐

    JAVA 实现延迟队列的方法

    JAVA 实现延迟队列的方法 JAVA 实现延迟队列的方法是指在 JAVA 中实现延迟队列的方法,即在特定的延迟时间后触发某个事件,这种机制广泛应用于日常开发的场景中,例如用户登录之后5分钟给用户做分类推送、用户多少...

    JAVA面试题(Zookeeper、消息队列、分布式等最新的也有)

    6. **数据库**:SQL查询优化、事务处理、索引原理,以及NoSQL数据库的优缺点。 7. **Spring框架**:IoC(控制反转)和DI(依赖注入)的概念,AOP(面向切面编程),以及Spring Boot和Spring Cloud的相关知识。 8. ...

    基于java数据结构实验 队列实验报告.docx

    在Java编程中,数据结构是实现高效算法的基础,队列是一种基本的数据结构,它遵循“先进先出”(FIFO)原则。在这个基于Java的数据结构实验中,我们专注于队列的实现,特别是顺序队列。实验的主要目的是让学生理解和...

    常用数据结构及其算法的Java实现,包括但不仅限于链表、栈,队列,树,堆,图等经典数据结构及其他经典基础算法(如排序.zip

    本资源是一个关于Java实现常用数据结构和算法的集合,涵盖了链表、栈、队列、树、堆以及图等核心概念,同时也包含了排序等基础算法。下面将详细解释这些知识点。 1. **链表**:链表是一种线性数据结构,它通过节点...

    java实现的数据结构与算法

    第一章主要介绍了Java语言的基础知识,包括基本数据类型及运算、流程控制语句、字符串、数组、类与对象、继承、接口、异常以及Java与指针的概念。这些内容是学习Java语言和后续数据结构的基础,理解了Java的基础特性...

    java 集合和内部类资料

    `内部类`文件可能详细阐述了内部类的使用场景、优缺点以及如何创建和使用它们。通过学习,你将能够熟练地运用内部类来增强代码的可读性、灵活性和复用性。 总之,这个资料包涵盖了Java集合框架和内部类的基础知识,...

    应用JAVA对操作系统中的多个进程进行调度模拟,包括先来先服务,最早时间优先、多级队列等,并进行了可视化界面实现.zip

    在本项目中,开发者利用Java语言实现了操作系统进程调度的模拟,涵盖了多种常见的调度算法,如先来先服务(FCFS)、最早结束时间优先(EFT)以及多级队列等。这些调度算法是操作系统核心功能的一部分,用于决定系统...

    JAVA 经典算法(也有C实现)

    通过对比Java和C语言的实现,可以深入理解两种语言的特性,比如Java的自动内存管理与C语言的手动内存控制,以及两者的性能差异。 总之,"JAVA 经典算法(也有C实现)"这个资源对于想要提升算法能力的开发者来说是一...

    JAVA基础技术框架详解二.pdf

    * HashMap 和 ConcurrentHashMap 的比较:包括它们的实现原理、优缺点等。 Java 并发编程 * Java 并发编程的基础:包括线程、Runnable、Callable 等概念。 * Java 并发编程的高级特性:包括 synchronized 关键字、...

    2017年阿里Java基础面试题文档 Java知识分享

    ### 2017年阿里Java基础面试题文档解析 #### 一、自我介绍与问题解决能力 在自我介绍部分,面试者应该清晰地表达自己的背景、经历以及为什么选择当前的职业道路。此外,通过讲述一个具体的问题解决案例,能够展现...

    各种算法 java和c语言两种实现

    对于学习者来说,比较Java和C语言的算法实现可以帮助提升编程技巧,理解不同语言的优缺点。在实际工作中,根据项目需求选择合适的语言和算法,可以提高代码的可读性、可维护性和性能。例如,如果项目要求高性能和...

    Java语言程序设计与数据结构(基础篇)第13章课后习题代码chapter13.rar

    9. **递归与迭代的关系**:在解题过程中,可能会对比递归和迭代两种解决问题的方法,讨论它们的优缺点及适用场景。 10. **数据结构的选择**:根据问题的具体需求,选择合适的数据结构是解决问题的关键。比如,使用...

    java基础 个人笔记

    - **数组列表**(ArrayList)、**链表**(LinkedList):两种常用列表实现,各有优缺点。 - **集合**(Set):不允许重复元素,如HashSet。 - **映射**(Map):存储键值对,如HashMap。 - **队列**(Queue)和*...

    TSP的java实现

    3. **Java实现**:使用Java编程语言实现TSP算法,需要熟悉Java的数据结构(如数组、链表、队列、栈等)以及算法基础。Java的面向对象特性使得代码可读性和可维护性更强,适合构建复杂的算法模型。 4. **格式清晰**...

    Java语言程序设计与数据结构(基础篇)第5章课后习题代码chapter5.rar

    《Java语言程序设计与数据结构(基础篇)》这本书深入浅出地介绍了这两方面的内容。第五章的课后习题代码提供了实践机会,帮助读者巩固理论知识,提高编程技能。 在Java中,数据结构主要包括数组、链表、栈、队列、...

    Java基础核心总结+面试宝典,涵盖Java面试的方方面

    《Java基础核心总结》这份文档会详细讲解Java语言的基础语法,包括但不限于变量、数据类型、运算符、流程控制语句、类与对象、封装、继承、多态等。同时,也会深入探讨异常处理、文件I/O、集合框架、线程并发等核心...

    java面试题集锦 基础题 java工程师面试

    首先,Java基础题是每个面试者必须掌握的,这些题目通常涵盖以下几个方面: 1. **Java语法**:包括变量、数据类型、运算符、流程控制(如if-else、switch、for、while等)、类与对象、封装、继承、多态等基本概念。...

    springcoud的java基础篇学习资料

    理解微服务的优缺点、设计原则以及如何在Java中实现是提升Spring Cloud开发能力的重要环节。 7. **Java并发编程**:在高并发环境下,Java的并发控制(如synchronized、Lock等)、线程池、Future和Callable接口的...

    【IT十八掌徐培成】Java基础第17天-04.多线程复制-1avi.zip

    本资源“【IT十八掌徐培成】Java基础第17天-04.多线程复制-1avi.zip”聚焦于Java中的多线程概念和实践,通过一个具体的“多线程复制”示例来深入讲解这一主题。 多线程是指在单个程序中同时执行多个线程,从而提高...

Global site tag (gtag.js) - Google Analytics