最近由于项目需求,参考有关的代码,学习封装了一个队列
主要技术点:
1. 进入队列,需要判断是否isFull(),
2. 出队列, 需要判断isEmpty(),
3. 队列允许插入任何对象
4. 最后一个知识点就是lock.lock(), finally{lock.unlock()}
每次相关操作就需要进行加锁和解锁
/**
*
*/
package util;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author Administrator
*
*/
public class Queue<Element> {
int arraySize;
private Element[] data;
private int first;
private int next;
Lock lock = new ReentrantLock();
public Queue(int size) {
// TODO Auto-generated constructor stub
arraySize = size;
empty();
}
/**
* 队列复位
* 关键是创建Element数组做data
* first, last = 0
*/
private void empty() {
// TODO Auto-generated method stub
lock.lock();
try{
data = (Element[]) new Object[arraySize];
first = 0;
next = 0;
}
finally{
lock.unlock();
}
}
/**
* 算法,计算队列的数组
* @return
*/
public int size(){
lock.lock();
try{
return (arraySize - first + next ) % arraySize;
}
finally{
lock.unlock();
}
}
/**
* 判断first, last的index是否相同?
* @return
*/
public boolean isEmpty() {
// TODO Auto-generated method stub
lock.lock();
try{
return (first == next);
}
finally{
lock.unlock();
}
}
/**
* 返回是否为空
* @return
*/
public boolean isFull(){
lock.lock();
try{
if(size() == (arraySize - 1)){
return true;
}
return false;
}
finally{
lock.unlock();
}
}
/**
* 关键算法
* data[next] = input 新插入数据放入data
* next = next+1 % arraySize
* @param socketSession
*/
public void enQueue(Element input) {
// TODO Auto-generated method stub
lock.lock();
try{
if(isFull()){
throw new RuntimeException("over flow");
}
data[next] = input;
next = (next + 1) % arraySize;
}
finally{
lock.unlock();
}
System.out.println("store socketsession");
}
/**
* 出队列算法,获取第一个元素
* 1. 判断是否为空队列
* 2. 去除第一个元素, element = data[first];
* 3. data[first]=null, 该位置附上空值
* 4. first++, 如果>=arraySize, first=0;
* @return
*/
public Element deQueue(){
Element result = null;
lock.lock();
try{
if(isEmpty()){
throw new RuntimeException("queue is empty");
}
result = data[first];
data[first] = null;
first++;
if(first >= arraySize){
first = 0;
}
return result;
}
finally{
lock.unlock();
}
}
}
分享到:
相关推荐
队列是一种基础且重要的数据结构,它遵循“先进先出”(FIFO)的原则,即最早进入队列的元素也将最早被移出。在计算机科学中,队列广泛应用于任务调度、多线程同步、缓冲区管理等多个领域。本文将详细讲解如何用纯...
队列是一种先进先出(FIFO, First In First Out)的数据结构,类似于现实生活中的排队等待服务。在这个主题中,我们将深入探讨如何使用C++实现一个队列类,以及如何进行基本的队列操作。 首先,`std::queue` 是C++...
循环队列(Circular Queue)是一种在计算机科学中广泛应用的数据结构,它结合了队列的先进先出(FIFO)原则与数组的高效存储。在这个实现中,我们主要探讨如何通过C++或者类似的编程语言来构建一个高效的循环队列,...
入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。 一、ConcurrentQueue内部结构: 1.实现原理 众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2....
在计算机科学中,队列是一种先进先出(FIFO,First In First Out)的数据结构。当日志记录请求过多时,使用队列可以避免因频繁写入而导致的性能瓶颈。将日志请求放入队列,然后异步处理,可以确保系统主线程不会被...
在IT领域,队列是一种基本的数据结构,它遵循“先进先出”(FIFO, First In First Out)的原则。在C语言中,实现队列通常需要我们手动管理内存,这涉及到了指针、动态内存分配以及内存释放等概念。本文将深入探讨...
接下来,队列是一种先进先出(FIFO, First In First Out)的数据结构,常见的应用包括任务调度、打印队列等。C++的标准库提供了`<queue>`来实现队列,但此压缩包提供了自定义版本。队列的基本操作有入队(enqueue)...
在编程领域,队列是一种非常基础且重要的数据结构,它遵循“先进先出”(FIFO,First In First Out)的原则。在C++中,我们可以使用标准库中的`<queue>`来实现队列,但为了更好地理解数据结构的运作机制,有时会...
队列是一种先进先出(FIFO, First In First Out)的数据结构,类似于现实生活中的排队等待。在队列中,元素的添加(入队)总是在队尾进行,而删除(出队)则始终发生在队头。这种特性使得队列在处理顺序请求或实现...
消息队列是操作系统提供的一种进程间通信(IPC)机制,它允许不同的进程之间...通过学习和理解这些代码,开发者可以更好地掌握Linux下C语言实现的消息队列操作,从而在实际项目中灵活运用这一有效的进程间通信工具。
在C++编程语言中,`Queue`是一种常用的数据结构,它遵循“先进先出”(First In First Out, FIFO)的原则。通常,C++标准库提供了`<queue>`头文件来实现基本的队列操作,但这个标准队列并没有设置上限。在某些特定...
在队列中,消息按照先进先出(FIFO)的原则进行处理。发送进程将消息放入队列,而接收进程从队列中取出消息。这种设计使得消息发送和接收可以独立进行,提高了系统的并发性和可靠性。 在C语言中,我们可以创建一个...
通过这个文件,我们可以验证源代码的功能是否正确,比如检查入队、出队操作是否符合队列的先进先出(FIFO)原则,以及队列在满和空状态下的处理是否得当。 在学习这部分内容时,重点理解以下几点: 1. 循环队列的...
- **队列**: 存储消息的数据结构,遵循先进先出(FIFO)原则,保证消息的有序性。 - **中间件**: 作为消息队列的管理平台,负责消息的路由、存储、分发等功能,如RabbitMQ、Kafka、ActiveMQ等。 2. **消息队列...
4. **自定义类**:像"priority_queue_1.0"这样的库可能就是通过创建自定义的MATLAB类来封装这些操作,提供一个简洁的接口供用户使用。 在"priority_queue_1.0"这个压缩包中,可能包含了实现上述功能的MATLAB源代码...
队列(Queue)则是一种先进先出(FIFO, First In First Out)的数据结构,元素按照进入队列的顺序依次被处理。在Java中,LinkedList同样可以用于实现队列,主要通过addLast()和removeFirst()方法。 以下是使用...
在实际开发中,可以参考QQueueDome中的代码示例进行学习和实践。这个示例可能包含了创建任务类、工作线程类以及主线程如何调度任务的具体实现,可以帮助你更好地理解这些概念和用法。通过阅读和理解代码,你可以掌握...
队列,作为一种数据结构,通常用于存储待处理的任务,遵循先进先出(FIFO)的原则。在多线程环境中,队列常被用作线程间通信的一种机制,确保数据的安全共享,避免竞争条件。 这个"Multi_Threaded_Job_Queue_demo...