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 中实现延迟队列的方法,即在特定的延迟时间后触发某个事件,这种机制广泛应用于日常开发的场景中,例如用户登录之后5分钟给用户做分类推送、用户多少...
6. **数据库**:SQL查询优化、事务处理、索引原理,以及NoSQL数据库的优缺点。 7. **Spring框架**:IoC(控制反转)和DI(依赖注入)的概念,AOP(面向切面编程),以及Spring Boot和Spring Cloud的相关知识。 8. ...
在Java编程中,数据结构是实现高效算法的基础,队列是一种基本的数据结构,它遵循“先进先出”(FIFO)原则。在这个基于Java的数据结构实验中,我们专注于队列的实现,特别是顺序队列。实验的主要目的是让学生理解和...
本资源是一个关于Java实现常用数据结构和算法的集合,涵盖了链表、栈、队列、树、堆以及图等核心概念,同时也包含了排序等基础算法。下面将详细解释这些知识点。 1. **链表**:链表是一种线性数据结构,它通过节点...
第一章主要介绍了Java语言的基础知识,包括基本数据类型及运算、流程控制语句、字符串、数组、类与对象、继承、接口、异常以及Java与指针的概念。这些内容是学习Java语言和后续数据结构的基础,理解了Java的基础特性...
`内部类`文件可能详细阐述了内部类的使用场景、优缺点以及如何创建和使用它们。通过学习,你将能够熟练地运用内部类来增强代码的可读性、灵活性和复用性。 总之,这个资料包涵盖了Java集合框架和内部类的基础知识,...
在本项目中,开发者利用Java语言实现了操作系统进程调度的模拟,涵盖了多种常见的调度算法,如先来先服务(FCFS)、最早结束时间优先(EFT)以及多级队列等。这些调度算法是操作系统核心功能的一部分,用于决定系统...
通过对比Java和C语言的实现,可以深入理解两种语言的特性,比如Java的自动内存管理与C语言的手动内存控制,以及两者的性能差异。 总之,"JAVA 经典算法(也有C实现)"这个资源对于想要提升算法能力的开发者来说是一...
* HashMap 和 ConcurrentHashMap 的比较:包括它们的实现原理、优缺点等。 Java 并发编程 * Java 并发编程的基础:包括线程、Runnable、Callable 等概念。 * Java 并发编程的高级特性:包括 synchronized 关键字、...
### 2017年阿里Java基础面试题文档解析 #### 一、自我介绍与问题解决能力 在自我介绍部分,面试者应该清晰地表达自己的背景、经历以及为什么选择当前的职业道路。此外,通过讲述一个具体的问题解决案例,能够展现...
对于学习者来说,比较Java和C语言的算法实现可以帮助提升编程技巧,理解不同语言的优缺点。在实际工作中,根据项目需求选择合适的语言和算法,可以提高代码的可读性、可维护性和性能。例如,如果项目要求高性能和...
9. **递归与迭代的关系**:在解题过程中,可能会对比递归和迭代两种解决问题的方法,讨论它们的优缺点及适用场景。 10. **数据结构的选择**:根据问题的具体需求,选择合适的数据结构是解决问题的关键。比如,使用...
- **数组列表**(ArrayList)、**链表**(LinkedList):两种常用列表实现,各有优缺点。 - **集合**(Set):不允许重复元素,如HashSet。 - **映射**(Map):存储键值对,如HashMap。 - **队列**(Queue)和*...
3. **Java实现**:使用Java编程语言实现TSP算法,需要熟悉Java的数据结构(如数组、链表、队列、栈等)以及算法基础。Java的面向对象特性使得代码可读性和可维护性更强,适合构建复杂的算法模型。 4. **格式清晰**...
《Java语言程序设计与数据结构(基础篇)》这本书深入浅出地介绍了这两方面的内容。第五章的课后习题代码提供了实践机会,帮助读者巩固理论知识,提高编程技能。 在Java中,数据结构主要包括数组、链表、栈、队列、...
《Java基础核心总结》这份文档会详细讲解Java语言的基础语法,包括但不限于变量、数据类型、运算符、流程控制语句、类与对象、封装、继承、多态等。同时,也会深入探讨异常处理、文件I/O、集合框架、线程并发等核心...
首先,Java基础题是每个面试者必须掌握的,这些题目通常涵盖以下几个方面: 1. **Java语法**:包括变量、数据类型、运算符、流程控制(如if-else、switch、for、while等)、类与对象、封装、继承、多态等基本概念。...
理解微服务的优缺点、设计原则以及如何在Java中实现是提升Spring Cloud开发能力的重要环节。 7. **Java并发编程**:在高并发环境下,Java的并发控制(如synchronized、Lock等)、线程池、Future和Callable接口的...
本资源“【IT十八掌徐培成】Java基础第17天-04.多线程复制-1avi.zip”聚焦于Java中的多线程概念和实践,通过一个具体的“多线程复制”示例来深入讲解这一主题。 多线程是指在单个程序中同时执行多个线程,从而提高...