- 浏览: 985947 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
Mina 协议编解码过滤器一(协议编解码工厂、协议编码器):
http://donald-draper.iteye.com/blog/2376663
Mina 协议编解码过滤器二(协议解码器):
http://donald-draper.iteye.com/blog/2376679
前面这两篇文章中,都涉及到Queue,我们今天就来看一Queue是如何工作的。
从上来看队列Queue实际上为List,用一个对象数组items存放元素,一个实际容量计数器size,一个队头first和一个队尾索引last,默认队列容量为4。
/
来看ensureCapacity
再来看出队列
再来看其他操作:
总结:
队列Queue实际上为List,用一个对象数组items存放元素,一个实际容量计数器size,一个队头first和一个队尾索引last,默认队列容量为4。push元素时,先判断队列是否已满,如果已满,则扩容队列为原来的两倍。Queue实际为具有队列特性的List。Queue可以随机地访问队列索引。
http://donald-draper.iteye.com/blog/2376663
Mina 协议编解码过滤器二(协议解码器):
http://donald-draper.iteye.com/blog/2376679
前面这两篇文章中,都涉及到Queue,我们今天就来看一Queue是如何工作的。
/** * A unbounded circular queue. * * @author The Apache Directory Project (mina-dev@directory.apache.org) * @version $Rev$, $Date$ */ public class Queue extends AbstractList implements List, Serializable { private static final int DEFAULT_CAPACITY = 4;//默认容量 private static final int DEFAULT_MASK = DEFAULT_CAPACITY - 1;//默认掩码 private Object[] items;//存放队列元素数组 private int mask; private int first = 0;//队头 private int last = 0;//队尾 private int size = 0;//队列实际容量 /** * Construct a new, empty queue. 构造空队列 */ public Queue() { items = new Object[DEFAULT_CAPACITY]; mask = DEFAULT_MASK; } }
从上来看队列Queue实际上为List,用一个对象数组items存放元素,一个实际容量计数器size,一个队头first和一个队尾索引last,默认队列容量为4。
/
** * Enqueue into this queue.添加元素到队列 */ public void push(Object item) { if (item == null) { throw new NullPointerException("item"); } ensureCapacity();//确保队列可以存放元素 items[last] = item;//存放元素 increaseSize();//更新实际容量size,及队尾索引 }
来看ensureCapacity
private void ensureCapacity() { //如果队列未满,直接返回 if (size < items.length) { return; } // expand queue,否则扩容,为原来的两倍 final int oldLen = items.length; Object[] tmp = new Object[oldLen * 2]; //拷贝原始队列数据到新队列 if (first < last) { System.arraycopy(items, first, tmp, 0, last - first); } else { System.arraycopy(items, first, tmp, 0, oldLen - first); System.arraycopy(items, 0, tmp, oldLen - first, last); } first = 0; last = oldLen; items = tmp; mask = tmp.length - 1; } //更新队尾,及size private void increaseSize() { last = (last + 1) & mask; size++; }
再来看出队列
/** * Dequeues from this queue. * * @return <code>null</code>, if this queue is empty or the element is * really <code>null</code>. */ public Object pop() { if (size == 0) { return null; } //返回队头元素,置空原始队头 Object ret = items[first]; items[first] = null; decreaseSize();//更新size,及队头索引 return ret; } private void decreaseSize() { first = (first + 1) & mask; size--; }
再来看其他操作:
/** * Returns the capacity of this queue.返回队列容量 */ public int capacity() { return items.length; } /** * Clears this queue.清空队列 */ public void clear() { Arrays.fill(items, null); first = 0; last = 0; size = 0; } /** * Returns the first element of the queue. * 返回队头元素 * @return <code>null</code>, if the queue is empty, or the element is * really <code>null</code>. */ public Object first() { if (size == 0) { return null; } return items[first]; } /** * Returns the last element of the queue. * 获取队尾元素 * @return <code>null</code>, if the queue is empty, or the element is * really <code>null</code>. */ public Object last() { if (size == 0) { return null; } return items[(last + items.length - 1) & mask]; } /** * Returns <code>true</code> if the queue is empty.是否为空 */ public boolean isEmpty() { return (size == 0); } /** * Returns the number of elements in the queue. 获取队列元素个数 */ public int size() { return size; } //获取索引对应的队列元素 public Object get(int idx) { checkIndex(idx);//检查索引 return items[getRealIndex(idx)]; } //检查索引 private void checkIndex(int idx) { if (idx < 0 || idx >= size) { throw new IndexOutOfBoundsException(String.valueOf(idx)); } } //获取实际队列索引 private int getRealIndex(int idx) { return (first + idx) & mask; } ////////////////////////////////////////// // java.util.List compatibility methods // ////////////////////////////////////////// //添加元素到队列 public boolean add(Object o) { push(o); return true; } //更新索引对应的元素 public Object set(int idx, Object o) { checkIndex(idx); int realIdx = getRealIndex(idx); Object old = items[realIdx]; items[realIdx] = o; return old; } //添加元素到指定索引 public void add(int idx, Object o) { //如果为队列,直接添加 if (idx == size) { push(o); return; } //检查索引,确保容量可用 checkIndex(idx); ensureCapacity(); //获取实际索引 int realIdx = getRealIndex(idx); // Make a room for a new element. //下面这个操作,比较耗时,将realIdx索引对应的前后元素重新移动队列中,把索引 //对应的位置腾出 if (first < last) { System .arraycopy(items, realIdx, items, realIdx + 1, last - realIdx); } else { if (realIdx >= first) { System.arraycopy(items, 0, items, 1, last); items[0] = items[items.length - 1]; System.arraycopy(items, realIdx, items, realIdx + 1, items.length - realIdx - 1); } else { System.arraycopy(items, realIdx, items, realIdx + 1, last - realIdx); } } items[realIdx] = o; increaseSize();//更新size,及队尾last } //移除指定索引对应的元素 public Object remove(int idx) { if (idx == 0) { return pop(); } checkIndex(idx); int realIdx = getRealIndex(idx); Object removed = items[realIdx]; // Remove a room for the removed element. //下面这个操作,比较耗时,将realIdx索引对应的前后元素重新移动队列中,把索引 //对应的位置清空,即占有掉 if (first < last) { System.arraycopy(items, first, items, first + 1, realIdx - first); } else { if (realIdx >= first) { System.arraycopy(items, first, items, first + 1, realIdx - first); } else { System.arraycopy(items, 0, items, 1, realIdx); items[0] = items[items.length - 1]; System.arraycopy(items, first, items, first + 1, items.length - first - 1); } } items[first] = null; decreaseSize();//更新size,及队头last return removed; } /////////////////////////////////////////// // java.util.Queue compatibility methods // /////////////////////////////////////////// //添加元素 public boolean offer(Object o) { push(o); return true; } //获取队头元素 public Object poll() { return pop(); } //移除队头元素 public Object remove() { if (size == 0) { throw new NoSuchElementException(); } return pop(); } //查看队列是否有元素 public Object peek() { return first(); } //返回队列元素 public Object element() { if (size == 0) { throw new NoSuchElementException(); } return first(); }
总结:
队列Queue实际上为List,用一个对象数组items存放元素,一个实际容量计数器size,一个队头first和一个队尾索引last,默认队列容量为4。push元素时,先判断队列是否已满,如果已满,则扩容队列为原来的两倍。Queue实际为具有队列特性的List。Queue可以随机地访问队列索引。
发表评论
-
Mina 报文连接器(NioDatagramConnector)
2017-06-14 08:46 1432Mina 抽象Polling连接器(A ... -
Mina 报文监听器NioDatagramAcceptor二(发送会话消息等)
2017-06-13 16:01 1559Mina 报文监听器NioDatagramAcceptor一( ... -
Mina 报文监听器NioDatagramAcceptor一(初始化,Io处理器)
2017-06-13 09:51 2594Mina Io监听器接口定义及抽象实现:http://dona ... -
Mina 报文通信简单示例
2017-06-12 09:01 2604MINA TCP简单通信实例:http://donald-dr ... -
Mina socket连接器(NioSocketConnector)
2017-06-12 08:37 4798Mina 抽象Polling连接器(AbstractPolli ... -
Mina 抽象Polling连接器(AbstractPollingIoConnector)
2017-06-11 21:29 1022Mina 连接器接口定义及抽象实现(IoConnector ) ... -
Mina 连接器接口定义及抽象实现(IoConnector )
2017-06-11 13:46 1842Mina IoService接口定义及抽象实现:http:// ... -
Mina socket监听器(NioSocketAcceptor)
2017-06-09 08:44 3443Mina IoService接口定义及抽象实现:http:// ... -
Mina 抽象polling监听器
2017-06-08 22:32 792Mina Io监听器接口定义及抽象实现:http://dona ... -
Mina Io监听器接口定义及抽象实现
2017-06-07 13:02 1362Mina IoService接口定义及抽象实现:http:// ... -
Mina IoService接口定义及抽象实现
2017-06-06 23:44 1206Mina IoHandler接口定义:http://donal ... -
Mina Nio会话(Socket,DataGram)
2017-06-06 12:53 1225Mina Socket会话配置:http://donald-d ... -
Mina 抽象Io会话
2017-06-05 22:45 1024Mina Io会话接口定义:http://donald-dra ... -
Mina Io会话接口定义
2017-06-04 23:15 1181Mina Nio处理器:http://donald-drape ... -
Mina Nio处理器
2017-06-04 22:19 753Mina Io处理器抽象实现:http://donald-dr ... -
Mina Io处理器抽象实现
2017-06-03 23:52 1158Mina 过滤链抽象实现:http://donald-drap ... -
Mina IoHandler接口定义
2017-06-01 21:30 1744Mina 过滤链抽象实现:http://donald-drap ... -
MINA 多路复用协议编解码器工厂二(多路复用协议解码器)
2017-06-01 12:52 2289MINA 多路复用协议编解码器工厂一(多路复用协议编码器): ... -
MINA 多路复用协议编解码器工厂一(多路复用协议编码器)
2017-05-31 22:22 1877MINA 多路分离解码器实例:http://donald-dr ... -
Mina 累计协议解码器
2017-05-31 00:09 1239MINA 编解码器实例:http://donald-drape ...
相关推荐
在IT行业中,队列(Queue)和MINA通信框架是两个关键的概念,它们在系统设计和网络编程中扮演着重要角色。本实例将探讨如何将队列与MINA通信框架结合,以实现高效、可靠的网络服务。以下是关于这两个概念及其结合...
Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...
Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...
MINA (Java IO Network Application Framework) 是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务器。这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和...
Mina和Socket是两种常见的网络通信框架和技术,它们在Java编程环境中被广泛使用。本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic ...
mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...
mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...
Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...
标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...
Apache Mina是一个高度可扩展的Java网络通信框架,它提供了简单而强大的开发接口,用于创建高性能、高效率的网络应用程序。Mina的核心理念是将网络协议处理与业务逻辑分离,使得开发者可以专注于实现应用程序的业务...
Apache Mina是一个开源项目,它提供了一个高度可扩展的网络通信框架,用于简化开发高性能、高可用性的网络服务器和客户端应用程序。"Mina demo mina jar包"指的是使用Apache Mina框架创建的一个演示示例,这个示例...
Apache Mina是一个高度可扩展的网络通信框架,它允许开发者创建高性能、高效率的服务端和客户端应用程序。在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。...
**mina自定义编解码器详解** mina是一个Java开发的网络通信框架,广泛应用于TCP和UDP协议的服务器和客户端开发。在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节...
**Spring Boot 整合Mina实现串口通信详解** 在Java开发中,有时我们需要与硬件设备进行串口通信,例如读取传感器数据或控制工业设备。Spring Boot作为一款轻量级的框架,使得快速构建应用变得简单。而Mina则是一款...
在本文中,我们将深入探讨如何将Spring Boot与Mina进行深度整合,以便为新手开发者提供一个开箱即用的解决方案。Spring Boot以其简洁的配置和快速的开发体验,已经成为Java领域中的主流微服务框架,而Mina则是一个...
Apache Mina是一个开源的网络通信框架,主要用于简化Java应用程序与远程服务器之间的通信。它提供了高度可扩展和高性能的网络协议处理能力,支持多种传输层协议,如TCP/IP、UDP/IP和SSL/TLS等。在本示例中,我们关注...
mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...
《mina2.0全部jar包详解》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发Java网络应用,特别是那些基于TCP和UDP协议的...
Apache Mina是一个强大的网络通信框架,专为基于TCP/IP和UDP/IP协议栈的应用设计。它提供了JAVA对象的序列化和虚拟机内部通信的功能,使得开发者能够迅速构建高性能、高可扩展性的网络应用。Mina的核心特性是其事件...