the reactor pattern and java nio
在《java NIO》作者PPT《How to Build a Scalable Multiplexed Server With NIO》 和 Doug Lea 《Scalable IO in Java》PPT中
都有java nio的实现是通过reactor pattern 来实现的有说明。java nio作为一种跨平台IO操作。
在不同平台上面封装了相应平台的IO模型。
在reactor pattern 作者中已经提及,通过reactor pattern 模式能够来实现跨平台操作。
所以,java nio通过reactor pattern模式就是这样完毕的。
java nio在window 平台以下是使用Select 模型。
对于java nio源码的分析。对于假设理解reactor pattern的设计模式意义不大。
由于java nio实现中
须要对JNI的封装。假设要了解对于不同平台的封装,能够通过ZThead库来了解会有更大的意义。
这样能够避免对JNI 的干扰。
由于JNI涉及到脚本语言java和C/C++交互的知识。
How to Build a Scalable Multiplexed Server With NIO
Reactor Pattern Mapped to NIO
Handle
SelectionKey
Event
SelectionKey.OP_READ, etc
Demultiplexer
Selector
Dispatcher
Selector.select() + iterate Selector.selectedKeys()
Handler
An instance of Runnable or Callable
最简单样例:TestReactor.java
public class TestReactor
{ public static void main(String[] args) throws Exception
{ //创建serversocketchannel通道.
ServerSocketChannel serversocketchannel =ServerSocketChannel.open();
//设置非堵塞,异步模式
serversocketchannel.configureBlocking(false);
//关联的serversocket
ServerSocket serversocket = serversocketchannel.socket();
SocketAddress endpoint =new InetSocketAddress("127.0.0.1", 8888);
//绑定指定的port
serversocket.bind(endpoint);
//创建Selector。 在Reactor Pattern模式中,相当于Demultiplexer 作用,用来多路复用器
Selector sel = Selector.open();
//在select中注冊链接事件。
//在reactor 模式中SelectionKey 相当于event事件。
//在SectionKey中存在OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT 事件类型。此时与OP_ACCEPT 关联的Channel为ServerSocketChannel
SelectionKey selKey = serversocketchannel.register(sel, SelectionKey.OP_ACCEPT);
while(true)
{
//进行堵塞操作,等待事件的到来。返回值在select 模型中表示完毕操作的数目
int selCount = sel.select();
if(selCount>0)
{
System.out.println("selCount=>>"+selCount);
}
//返回能够操作的键集合。在window select 模型中,返回能够操作的fd_set集合
Set<SelectionKey> selKeySet = sel.selectedKeys();
for(SelectionKey key:selKeySet)
{ //在SelectionKey中,存在链接能够接受事件,则调用accept()函数就不会存在堵塞现象。 //select
if(key.isAcceptable())
{
//获取与SelectionKey.OP_ACCEPT关联的通道。即ServerSocketChannel.
ServerSocketChannel serverChannel = (ServerSocketChannel)key.channel();
//调用ServerSocketChannel 不会发生堵塞。 获取到客户链接
SocketChannel socketchannel = serverChannel.accept();
//设置堵塞模式
socketchannel.configureBlocking(false);
//关联SocketChannel的读和写事件
socketchannel.register(sel, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
//同一时候能够在SelectionKey中关联其它对象。在Select 模式中。Selectionkey 相当于Completionkey參数
}
if(key.isWritable())
{
SocketChannel socketchannel = (SocketChannel)key.channel();
ByteBuffer src =ByteBuffer.allocate(100);
src.putInt(100);
src.flip();
socketchannel.write(src);
//关联SocketChannel的读和写事件
socketchannel.register(sel, SelectionKey.OP_READ);
//同一时候能够在SelectionKey中关联其它对象。 在Select 模式中,Selectionkey 相当于Completionkey參数 }
if(key.isReadable())
{
SocketChannel socketchannel = (SocketChannel)key.channel();
InetSocketAddress remote = (InetSocketAddress)socketchannel.getRemoteAddress();
String remotestring = remote.getHostString()+remote.getPort();
//关联SocketChannel的读和写事件
socketchannel.register(sel, SelectionKey.OP_WRITE);
//同一时候能够在SelectionKey中关联其它对象。在Select 模式中,Selectionkey 相当于Completionkey參数
}
selKeySet.remove(key);
} } }
}
the reactor pattern and java nio的更多相关文章
- reactor模式与java nio
Reactor是由Schmidt, Douglas C提出的一种模式,在高并发server实现中广泛採用. 改模式採用事件驱动方式,当事件出现时,后调用对应的事件处理代码(Event Handl ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- Java NIO 与 基于reactor设计模式的事件处理模型
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...
- java NIO的多路复用及reactor模式【转载】
关于java的NIO,以下博客总结的比较详细,适合初学者学习(http://ifeve.com/java-nio-all/) 下面的文字转载自:http://www.blogjava.net/hell ...
- java NIO中的Reactor相关知识汇总 (转)
一.引子 nio是java的IO框架里边十分重要的一部分内容,其最核心的就是提供了非阻塞IO的处理方式,最典型的应用场景就是处理网络连接.很多同学提起nio都能说起一二,但是细究其背后的原理.思想往往 ...
- Java NIO学习与记录(八): Reactor两种多线程模型的实现
Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...
- 3、谈谈 Java NIO
在 JDK1.4 之后,为了提高 Java IO 的效率,Java 提供了一套 New IO (NIO),之所以称之为 New,原因在于它相对于之前的 IO 类库是新增的.此外,旧的 IO 类库提供的 ...
- 笔记-reactor pattern
笔记-reactor pattern 1. reactor模式 1.1. 什么是reactor模式 The reactor design pattern is an event han ...
- Reactor Pattern and Non-blocking IO--reference
reference from:http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html ...
随机推荐
- 腾讯微信支付,程序员是如何让jQuery代码付钱的
微信支付和支付宝支付已经是我们生活中不可确实的两个金融软件了,也是必备的,小编认为小钱用微信,大钱用支付宝. 下面这个图是我们生活中用腾讯微信支付平台的最后一个页面,大家想不想知道这个页面是如果做出来 ...
- Ubuntu 14.04LTS+Git
Git是我们常用的代码托管工具,作为程序员,Git是必备的. 安装Git的方法很简单,官网就有写:http://git-scm.com/download/linux 根据官网的说明,用: sudo a ...
- 51nod 1096 距离之和最小【中位数】
1096 距离之和最小 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 X轴上有N个点,求X轴上一点使它到这N个点的距离之和最小,输出这个最小的距离 ...
- Codeforces Round #446 (Div. 2) A. Greed【模拟】
A. Greed time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- 由"软件是干什么的"引发的思考
自工作以来,都只在进行模块的开发,很少站在整个项目的角度思考过.甚至,自己开发的软件,自己都没有去用过,包括开发的一些APP,都没有下载来认真体验过.思考过.却对自己手机上那些用过的A ...
- 分层图【p4568】 [JLOI2011]飞行路线
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在nn个城市设有业务,设这些城市分别标记为\(0\)到\(n−1\),一共有\(m\)种航线 ...
- BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分)(线段树单点修改)
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14968 Solved: 6079[Submit][Stat ...
- Spiral Matrix -- LeetCode
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- POJ 2155 Matrix(树状数组+容斥原理)
[题目链接] http://poj.org/problem?id=2155 [题目大意] 要求维护两个操作,矩阵翻转和单点查询 [题解] 树状数组可以处理前缀和问题,前缀之间进行容斥即可得到答案. [ ...
- 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解
语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...