`
nbtlxx
  • 浏览: 249423 次
  • 性别: 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
分享到:
评论

相关推荐

    PHP实现基于Redis的MessageQueue队列封装操作示例

    本文实例讲述了PHP实现基于Redis的MessageQueue队列封装操作。分享给大家供大家参考,具体如下: Redis的链表List可以用来做链表,高并发的特性非常适合做分布式的并行消息传递。 项目地址:...

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

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

    队列类Queue的C++实现

    队列类queue的c++实现,包括了队列的出对,入队,获取队头元素,清空队列,判断队列空满等常规操作。对初学者很有帮助哈

    队列的一个纯C的封装

    纯C封装的一个队列,完全的可以运行是一个工程文件,下面3个文件分别是queue.h queue.c main.c main.c是测试文件,纯C封装的,对于学习C和数据结构的新手来说非常适合

    在vue中封装的弹窗组件使用队列模式实现方法

    队列(Queue)是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在尾部进行插入操作(入队 enqueue),在头部进行删除操作(出队 dequeue)。队列的操作方式和...

    queue-core:阿里云消息队列api封装

    &lt;artifactId&gt;queue-core &lt;version&gt;1.1.0 1.2 添加MQ配置信息 添加MQ配置信息必须实现MQConnection接口 @Component public class ConnectionConfig implements MQConnection { @Value("${mq.secretKey}") ...

    基于python实现的sqlite队列,方便的处理sqlite并发

    基于python实现的sqlite队列,方便的处理sqlite并发。SqliteQueue是继承了threading.Thread的线程,并且维护了一个向sqlite请求的队列。支持peewee请求。SqlQuery简单的封装了SQL语句

    laravel-queue-rabbitmq, 用于 Laravel 队列的RabbitMQ驱动程序.zip

    laravel-queue-rabbitmq, 用于 Laravel 队列的RabbitMQ驱动程序 用于 Laravel的 RabbitMQ队列驱动程序 安装通过 Composer 安装这里软件包,使用:composer require vladimir-yuldashev/laravel-queue-

    [算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值

    队列,Python中的queue模块是对栈和队列的封装,可以直接调用类的属性和方法,队列类似于一条管道,元素先进先出,进put(arg),取get( )。需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一...

    队列处理DEMO,封装好了一个队列类直接引用即可。

    封装了一个队列处理类,方便调用。使用VC2015开发,开发语言C++。 class ManageQueue { public: ManageQueue(); virtual ~ManageQueue(); static void AddCmd&#40;std::string cmdStr&#41;; static std::...

    JAVA小工具——持久暂存队列【V2.0】persistent_queue-v2.0-all.zip

    基于JAVA开源的BigQueue二次封装的小工具,生产消费模式轻量级组件,无需部署、配置服务,一个JAR工具库即可使用。 组件小特点: &gt; 身小轻量 &gt; 示例清晰 &gt; 开箱即用 &gt; 数据持久不丢失 &gt; 让程序员更自由零配置 ...

    C#编写一个类实现队列的功能,

    C#编写一个类实现队列的功能,并编写一个测试类测试该队列的功能(参考.Net的类库中已经封装好了的队列类:System.Collections.Queue,可以将自己做好的类,和它进行比较)

    Laravel 队列使用的实现

    队列Queue便是其中之一。 Windows环境下,可使用PHPstorm作为Laravel的集成开发环境IDE。 2 队列 Laravel可配置多种队列驱动,包括 “sync”, “database”, “beanstalkd”, “sqs”, “redis”, “null”(具体...

    pq:用Python编写的PostgreSQL简单事务队列

    它允许您以各种方式将项目推送和弹出队列,以及从队列中弹出项目,还提供了两个计划选项:延迟处理和优先级。 系统使用单个表来容纳所有队列中的所有作业。 具体细节易于定制。 系统当前仅支持数据库驱动程序-或...

    xgnet oiocp(重叠完成端口) 封装库,网络引擎

    引擎内部实现参考了 ACE 的种种概念,比如 proactor(预先操作,前摄器),task(任务),主动对象(Active Object),message queue(消息队列),lock(锁),guard(锁守护). 在内部需要缓存的发送和接收的数据会被放入内存池...

    Implementing-a-Thread-Safe-Queue-using-Condition-Variables

    Basic Thread Safety 使用mutex实现简单的线程安全最简单的办法是封装一个非线程安全的队列,使用mutex保护它(实例使用boost中的方法和类型,需要1.35以上版)template&lt;typename&gt;class concurrent_queue{private: ...

    async-framework:基于Disruptor的异步并行框架

    async-framework提供了流程和队列的概念,流程 Flow 代表步骤,队列 Queue 代表处理节点,队列由Disruptor封装而成,每个事件都有Flow发起,并且在每个Queue存在一个状态,每个队列处理特定的事件,简单的来说 Flow ...

    Android代码-MutilDialogManger

    为了演示这个Demo, 我搬出了珍藏多年的Dialog封装。。。里面包含了一些常用Dialog的封装。具体可以看Demo代码。 现在开始正式逻辑功能的实现,我们创建一个DialogManager的单例用于管理弹窗的各种显示。在此之上我们...

    C语言实现计算机网络技术.zip

    queue.c/h:队列数据结构的封装文件并实现了队列的一系列操作的函数 task.c/h:上传和下载任务的函数分装文件,定义了任务、连接等结构,实现了对上传和下载的控制操作函数 timer.c/h:计算时间辅助文件,实现了计算...

Global site tag (gtag.js) - Google Analytics