`
nbtlxx
  • 浏览: 253198 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

参考学习封装Queue队列,先进先出

阅读更多
最近由于项目需求,参考有关的代码,学习封装了一个队列
主要技术点:
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();
		}		
	}
}

1
0
分享到:
评论

相关推荐

    队列的一个纯C的封装

    队列是一种基础且重要的数据结构,它遵循“先进先出”(FIFO)的原则,即最早进入队列的元素也将最早被移出。在计算机科学中,队列广泛应用于任务调度、多线程同步、缓冲区管理等多个领域。本文将详细讲解如何用纯...

    队列类Queue的C++实现

    队列是一种先进先出(FIFO, First In First Out)的数据结构,类似于现实生活中的排队等待服务。在这个主题中,我们将深入探讨如何使用C++实现一个队列类,以及如何进行基本的队列操作。 首先,`std::queue` 是C++...

    CircularQueue循环队列实现

    循环队列(Circular Queue)是一种在计算机科学中广泛应用的数据结构,它结合了队列的先进先出(FIFO)原则与数组的高效存储。在这个实现中,我们主要探讨如何通过C++或者类似的编程语言来构建一个高效的循环队列,...

    c#高效的线程安全队列ConcurrentQueueT的实现

    入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。 一、ConcurrentQueue内部结构: 1.实现原理 众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2....

    C#日志封装类,队列方式处理

    在计算机科学中,队列是一种先进先出(FIFO,First In First Out)的数据结构。当日志记录请求过多时,使用队列可以避免因频繁写入而导致的性能瓶颈。将日志请求放入队列,然后异步处理,可以确保系统主线程不会被...

    queue_C语言队列_

    在IT领域,队列是一种基本的数据结构,它遵循“先进先出”(FIFO, First In First Out)的原则。在C语言中,实现队列通常需要我们手动管理内存,这涉及到了指针、动态内存分配以及内存释放等概念。本文将深入探讨...

    栈和队列的C++类封装实现.zip

    接下来,队列是一种先进先出(FIFO, First In First Out)的数据结构,常见的应用包括任务调度、打印队列等。C++的标准库提供了`&lt;queue&gt;`来实现队列,但此压缩包提供了自定义版本。队列的基本操作有入队(enqueue)...

    C++队列实现,封装了数据结构中的队列

    在编程领域,队列是一种非常基础且重要的数据结构,它遵循“先进先出”(FIFO,First In First Out)的原则。在C++中,我们可以使用标准库中的`&lt;queue&gt;`来实现队列,但为了更好地理解数据结构的运作机制,有时会...

    Basic_Operations_queue.rar_c 队列_队列

    队列是一种先进先出(FIFO, First In First Out)的数据结构,类似于现实生活中的排队等待。在队列中,元素的添加(入队)总是在队尾进行,而删除(出队)则始终发生在队头。这种特性使得队列在处理顺序请求或实现...

    消息队列接口封装

    消息队列是操作系统提供的一种进程间通信(IPC)机制,它允许不同的进程之间...通过学习和理解这些代码,开发者可以更好地掌握Linux下C语言实现的消息队列操作,从而在实际项目中灵活运用这一有效的进程间通信工具。

    C++ Queue(带上限的)

    在C++编程语言中,`Queue`是一种常用的数据结构,它遵循“先进先出”(First In First Out, FIFO)的原则。通常,C++标准库提供了`&lt;queue&gt;`头文件来实现基本的队列操作,但这个标准队列并没有设置上限。在某些特定...

    queue_C语言消息队列_

    在队列中,消息按照先进先出(FIFO)的原则进行处理。发送进程将消息放入队列,而接收进程从队列中取出消息。这种设计使得消息发送和接收可以独立进行,提高了系统的并发性和可靠性。 在C语言中,我们可以创建一个...

    Circular_Queue.rar

    通过这个文件,我们可以验证源代码的功能是否正确,比如检查入队、出队操作是否符合队列的先进先出(FIFO)原则,以及队列在满和空状态下的处理是否得当。 在学习这部分内容时,重点理解以下几点: 1. 循环队列的...

    queue_消息队列_

    - **队列**: 存储消息的数据结构,遵循先进先出(FIFO)原则,保证消息的有序性。 - **中间件**: 作为消息队列的管理平台,负责消息的路由、存储、分发等功能,如RabbitMQ、Kafka、ActiveMQ等。 2. **消息队列...

    priority_queue_1.0_excitingfbh_matlab优先队列_matlab优先队列_优先队列_

    4. **自定义类**:像"priority_queue_1.0"这样的库可能就是通过创建自定义的MATLAB类来封装这些操作,提供一个简洁的接口供用户使用。 在"priority_queue_1.0"这个压缩包中,可能包含了实现上述功能的MATLAB源代码...

    使用LinkedList模拟堆栈

    队列(Queue)则是一种先进先出(FIFO, First In First Out)的数据结构,元素按照进入队列的顺序依次被处理。在Java中,LinkedList同样可以用于实现队列,主要通过addLast()和removeFirst()方法。 以下是使用...

    Qt中使用QQueue模拟消息队列

    在实际开发中,可以参考QQueueDome中的代码示例进行学习和实践。这个示例可能包含了创建任务类、工作线程类以及主线程如何调度任务的具体实现,可以帮助你更好地理解这些概念和用法。通过阅读和理解代码,你可以掌握...

    MFC的多线程队列程序源代码

    队列,作为一种数据结构,通常用于存储待处理的任务,遵循先进先出(FIFO)的原则。在多线程环境中,队列常被用作线程间通信的一种机制,确保数据的安全共享,避免竞争条件。 这个"Multi_Threaded_Job_Queue_demo...

Global site tag (gtag.js) - Google Analytics