最近由于项目需求,参考有关的代码,学习封装了一个队列
主要技术点:
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();
}
}
}
分享到:
相关推荐
本文实例讲述了PHP实现基于Redis的MessageQueue队列封装操作。分享给大家供大家参考,具体如下: Redis的链表List可以用来做链表,高并发的特性非常适合做分布式的并行消息传递。 项目地址:...
入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。 一、ConcurrentQueue内部结构: 1.实现原理 众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2....
队列类queue的c++实现,包括了队列的出对,入队,获取队头元素,清空队列,判断队列空满等常规操作。对初学者很有帮助哈
纯C封装的一个队列,完全的可以运行是一个工程文件,下面3个文件分别是queue.h queue.c main.c main.c是测试文件,纯C封装的,对于学习C和数据结构的新手来说非常适合
队列(Queue)是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在尾部进行插入操作(入队 enqueue),在头部进行删除操作(出队 dequeue)。队列的操作方式和...
<artifactId>queue-core <version>1.1.0 1.2 添加MQ配置信息 添加MQ配置信息必须实现MQConnection接口 @Component public class ConnectionConfig implements MQConnection { @Value("${mq.secretKey}") ...
基于python实现的sqlite队列,方便的处理sqlite并发。SqliteQueue是继承了threading.Thread的线程,并且维护了一个向sqlite请求的队列。支持peewee请求。SqlQuery简单的封装了SQL语句
laravel-queue-rabbitmq, 用于 Laravel 队列的RabbitMQ驱动程序 用于 Laravel的 RabbitMQ队列驱动程序 安装通过 Composer 安装这里软件包,使用:composer require vladimir-yuldashev/laravel-queue-
队列,Python中的queue模块是对栈和队列的封装,可以直接调用类的属性和方法,队列类似于一条管道,元素先进先出,进put(arg),取get( )。需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一...
封装了一个队列处理类,方便调用。使用VC2015开发,开发语言C++。 class ManageQueue { public: ManageQueue(); virtual ~ManageQueue(); static void AddCmd(std::string cmdStr); static std::...
基于JAVA开源的BigQueue二次封装的小工具,生产消费模式轻量级组件,无需部署、配置服务,一个JAR工具库即可使用。 组件小特点: > 身小轻量 > 示例清晰 > 开箱即用 > 数据持久不丢失 > 让程序员更自由零配置 ...
C#编写一个类实现队列的功能,并编写一个测试类测试该队列的功能(参考.Net的类库中已经封装好了的队列类:System.Collections.Queue,可以将自己做好的类,和它进行比较)
队列Queue便是其中之一。 Windows环境下,可使用PHPstorm作为Laravel的集成开发环境IDE。 2 队列 Laravel可配置多种队列驱动,包括 “sync”, “database”, “beanstalkd”, “sqs”, “redis”, “null”(具体...
它允许您以各种方式将项目推送和弹出队列,以及从队列中弹出项目,还提供了两个计划选项:延迟处理和优先级。 系统使用单个表来容纳所有队列中的所有作业。 具体细节易于定制。 系统当前仅支持数据库驱动程序-或...
引擎内部实现参考了 ACE 的种种概念,比如 proactor(预先操作,前摄器),task(任务),主动对象(Active Object),message queue(消息队列),lock(锁),guard(锁守护). 在内部需要缓存的发送和接收的数据会被放入内存池...
Basic Thread Safety 使用mutex实现简单的线程安全最简单的办法是封装一个非线程安全的队列,使用mutex保护它(实例使用boost中的方法和类型,需要1.35以上版)template<typename>class concurrent_queue{private: ...
async-framework提供了流程和队列的概念,流程 Flow 代表步骤,队列 Queue 代表处理节点,队列由Disruptor封装而成,每个事件都有Flow发起,并且在每个Queue存在一个状态,每个队列处理特定的事件,简单的来说 Flow ...
为了演示这个Demo, 我搬出了珍藏多年的Dialog封装。。。里面包含了一些常用Dialog的封装。具体可以看Demo代码。 现在开始正式逻辑功能的实现,我们创建一个DialogManager的单例用于管理弹窗的各种显示。在此之上我们...
queue.c/h:队列数据结构的封装文件并实现了队列的一系列操作的函数 task.c/h:上传和下载任务的函数分装文件,定义了任务、连接等结构,实现了对上传和下载的控制操作函数 timer.c/h:计算时间辅助文件,实现了计算...