- 浏览: 1020668 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
Reactor模式和NIO
板桥里人 jdon.com 2002/11/08
|
本文可看成是对Doug Lea Scalable IO in Java 一文的翻译。
当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构:
1. Read request
2. Decode request
3. Process service
4. Encode reply
5. Send reply
经典的网络服务的设计如下图,在每个线程中完成对数据的处理:
但这种模式在用户负载增加时,性能将下降非常的快。我们需要重新寻找一个新的方案,保持数据处理的流畅,很显然,事件触发机制是最好的解决办法,当有事件发生时,会触动handler,然后开始数据的处理。
Reactor模式类似于AWT中的Event处理:
Reactor模式参与者
1.Reactor 负责响应IO事件,一旦发生,广播发送给相应的Handler去处理,这类似于AWT的thread
2.Handler 是负责非堵塞行为,类似于AWT ActionListeners;同时负责将handlers与event事件绑定,类似于AWT
addActionListener
如图:
Java的NIO为reactor模式提供了实现的基础机制,它的Selector当发现某个channel有数据时,会通过SlectorKey来告知我们,在此我们实现事件和handler的绑定。
我们来看看Reactor模式代码:
public class Reactor implements Runnable{ final Selector selector; Reactor(int port) throws IOException {
//运行Acceptor或SocketReadHandler } class Acceptor implements Runnable { // inner |
以上代码中巧妙使用了SocketChannel的attach功能,将Hanlder和可能会发生事件的channel链接在一起,当发生事件时,可以立即触发相应链接的Handler。
再看看Handler代码:
public class SocketReadHandler implements Runnable {
public static Logger logger = Logger.getLogger(SocketReadHandler.class); private Test test=new Test(); final SocketChannel socket; public SocketReadHandler(Selector sel, SocketChannel
c) socket = c; socket.configureBlocking(false); //将SelectionKey绑定为本Handler 下一步有事件触发时,将调用本类的run方法。 public void run() {
ByteBuffer input = ByteBuffer.allocate(1024); int bytesRead = socket.read(input); ...... //激活线程池 处理这些request .....
|
注意在Handler里面又执行了一次attach,这样,覆盖前面的Acceptor,下次该Handler又有READ事件发生时,将直接触发Handler.从而开始了数据的读 处理 写 发出等流程处理。
将数据读出后,可以将这些数据处理线程做成一个线程池,这样,数据读出后,立即扔到线程池中,这样加速处理速度:
更进一步,我们可以使用多个Selector分别处理连接和读事件。
一个高性能的Java网络服务机制就要形成,激动人心的集群并行计算即将实现。
EDA
DCI 中场景的生命周期是如何的呢?有请Banq大哥出面。..
大家,这两天看了与 DCI 相关的文章,写了这么个测试程序,请指正。 //ppt function Player(name) { this .name = name;....
OAuth非常复杂,但是考察Amazon的Web服务发现它们并没有使用OAuth,那么是如何保证 REST 安全性呢? 答案在: HMAC ,说白了就是HASH,每个客户端第一次发出请求时,将自....
O'Grady确认Java现在达到其高峰时期,很难如Forrester宣传那样迅速死亡。 O'Grady这个观点是基于RedMonk搜集的各种数据,RedMonk注重研究开发者,而不是企业中那些所谓....
我利用学到的开发方法,面向各种开发,可我发现我还是错的,只有面向客户,面向最终用户的开发,才是正确的,我所见的客户,他们最关心的不是你的团队写的代码如何,分析的多么条条有理,而是要一个漂亮的界面,正确....
看了这个帖子 http://www.jdon.com/jivejdon/thread/37712/15,深受启发。 因为我也正好碰到这个问题。比如一堆分类,每个分类需要统计其下Product的数量。....
都说数据库对 OO 有阻碍作用,关系型数据库不是也能体现出对象之间的关系吗?外键代表单向,中间再放个关联表,不就代表双向关联了吗、对象之间不也就这几种关系吗?继承除外啊。..
前段时间看了下color uml 和 DCI 发现 四色 原型可以直接通过 DCI 来实现 觉得非常不错。 在网上看了几个 DCI 的例子——主要是转账那个,然后自己开始琢磨1个....
要实现一个像svn版本同步功能的信息同步模块。 在项目中有User用户信息,由于可能用 pc android IOS等客户端登录到服务器来同步User信息。User用户信息产生不一致的情况主要是 同....
Ruby成熟应用曾经以Twitter为骄傲,Twitter曾经一度前台使用Ruby,后台使用Java,可随着系统规模扩展,Twitter决定放弃RoR,早在2008到2009年,他们就开始将后台消息系....
文章比较全面分析了系统可 伸缩性 scalable设计。 首先指出scalable和普通意义上性能提升有些不同,以至于更多人关注单台机器性能,而无视更高意义上性能扩充。 Scalable可 ....
repository是针对聚合跟建立还是针对实体对象啊? 比方说员工是聚合跟,考勤记录是员工的一个属性,是个list; 我是对应聚合跟 Employeerepository 我想添加一条考勤记录的....
在Yahoo的 SOA讨论组 一直持续着 OO 面向对象和SOA之间的讨论,涉及领域模型domain model, 消息格式message format 和服务设计考量等方面。 随着MDD/DD....
目前公司的一个产品使用的架构是struts+sessionBean+DAO+DB模式,平时所谓的设计工作也都是在做数据库方面的设计,增加几个DAO方法,或是在原DAO方法上if else来满足客户需求....
7讨论
171浏览
1顶
8讨论
403浏览
4顶
2讨论
636浏览
2顶
3讨论
900浏览
2顶
15讨论
1116浏览
4顶
4讨论
506浏览
6顶
8讨论
329浏览
1顶
23讨论
737浏览
4顶
1讨论
168浏览
1顶
12讨论
2182浏览
13顶
1讨论
1129浏览
4顶
12讨论
854浏览
3顶
7讨论
1289浏览
5顶
6讨论
1461浏览
7顶
发表评论
-
调试jdk中的源码,查看jdk局部变量
2013-06-15 23:30 1060调试jdk中的源码,查看jdk局部变量 2012-04 ... -
Eclipse快捷键 10个最有用的快捷键<转>
2013-04-11 23:28 1085Eclipse中10个最有用的快捷键组合 一个Eclip ... -
Lucene 3.6 中文分词、分页查询、高亮显示等
2012-12-09 23:35 18341、准备工作 下载lucene 3.6.1 : htt ... -
Maven实战(九)——打包的技巧(转)
2012-10-12 00:41 944“打包“这个词听起 ... -
基于Maven的web工程如何配置嵌入式Jetty Server开发调试环境(转)
2012-10-12 00:28 9501、首先在web工程的POM文件里添加依赖jar包如下: ... -
轻轻松松学Solr(1)--概述及安装[转]
2012-09-18 14:59 1000概述 这段时间对企 ... -
分析Netty工作流程[转]
2012-09-04 19:02 897下面以Netty中Echo的例 ... -
让eclipse在ubuntu下面好看一点
2012-03-27 10:17 932<p> </p> <h1 cla ... -
zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)[转]
2012-01-12 17:59 1657安装和配置详解 本文 ... -
Jakarta-Common-BeanUtils使用笔记[转]
2012-01-10 14:13 1163Jakarta-Common-BeanUtils ... -
一个关于Java Thread wait(),notify()的实用例【转】
2012-01-07 16:05 1027///// // ProducerConsume ... -
Java基础:Java中的 assert 关键字解析【转】
2012-01-06 19:50 1072J2SE 1.4在语言上提供了 ... -
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发[转]
2012-01-06 15:02 1277六种异常处理的陋习 ... -
如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
2011-12-26 10:48 1594HP QC(Quantity Center) 是一款不错的测 ... -
JAVA读写文件,中文乱码 【转】
2011-12-19 23:43 2128最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
Java 6 JVM参数选项大全(中文版)【转】
2011-12-19 19:51 979Java 6 JVM参数选项大全(中文版) 作者 ... -
使用assembly plugin实现自定义打包【转】
2011-12-13 01:58 979在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
使用maven ant task实现非标准打包[转]
2011-12-13 01:56 1053maven很强大,但是总有些事情干起来不是得心应手,没有使用a ... -
Java日期转换SimpleDateFormat格式大全【转】
2011-12-08 20:22 132324小时制时间 显示: public clas ... -
使用Spring的表单标签库
2011-11-22 20:08 108313.9. 使用Spring的 ...
相关推荐
总结来说,Reactor模式和Java的NIO相结合,提供了一种高效、灵活的处理网络I/O事件的方式,尤其适合处理大规模并发连接的情况。在设计和实现高性能的网络服务器时,这两种技术经常被结合使用,以实现高并发、低延迟...
Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到并发编程的核心理论和技术。在Java中,多线程是提高程序效率、实现并发执行的重要手段。设计模式则是解决软件开发中常见问题的经验总结,它为多线程环境下...
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...
在反应器模式的Java实现中,一个Reactor(反应器)负责监听和分发事件,它持续监测一个或多个输入源,一旦有事件发生,它就将事件分发给相应的处理器进行处理。处理器(Handler)定义了事件处理的方法,每个处理器...
2. **Java多线程实现**: - 实现方式一:继承`Thread`类。创建一个新的类,继承自`Thread`,重写`run()`方法,然后创建该类的实例并调用`start()`方法启动线程。 - 实现方式二:实现`Runnable`接口。创建一个类,...
本示例代码旨在帮助开发者理解如何使用Java NIO和Reactor模式构建网络服务。尽管测试代码可能不完全准确,但它能展示基本的原理和工作流程。 首先,我们要了解什么是Reactor模式。Reactor模式是一种事件驱动的设计...
Reactor主要有单线程Reactor、多线程Reactor和主从Reactor三种模式。 1. 单线程Reactor:所有事件都在一个线程中处理,简单但可能成为性能瓶颈。 2. 多线程Reactor:分为事件注册和事件处理两个线程池,提高了处理...
通过分析和运行这些代码,你将能够更深入地理解Java多线程在高并发场景下的实际运用,从而在你的人工智能项目中实现更高效、更稳定的数据处理。 总之,这个项目实例旨在帮助开发者掌握Java多线程技术,提升处理高...
标题《Scalable IO in Java》和描述表明本文档讨论了Java中的可伸缩网络I/O编程,并且特别聚焦于NIO的Selector模式。NIO,全称为Non-blocking I/O(非阻塞I/O),是Java提供的一种用于处理网络通信或文件I/O的编程...
Java NIO支持面向缓冲区的(Buffer-oriented)I/O操作,使用通道(Channels)而不是流(Streams)来传输数据,同时NIO引入了选择器(Selectors),允许单个线程来监视多个输入通道(Channel),并且只在某个输入通道...
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能...通过仔细阅读这个例程,相信你已经大致了解NIO的原理和使用方法,下一篇,我们将使用多线程来处理这些数据,再搭建一个自己的Reactor模式。
- **多线程BIO**:通过多线程处理读写,支持并发连接,但存在大量闲置连接和线程上下文切换问题。 ### NIO模式 - **Basic NIO**:在单线程中处理所有连接,效率低下。 - **基于Selector的NIO**:通过事件驱动和...
Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种机制使得程序能够高效地处理多个网络连接,而无需为每个连接创建单独的线程,大大...
主从多线程模型的特点是:服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求处理完成后(可能包含接入认证等),将新创建的SocketChannel注册到IO...
- **多级Reactor多线程模型**:主从Reactor模式的进一步扩展,增加了工作线程池,确保业务处理与I/O操作解耦,提高并发能力。 Netty的默认模式类似于第三种模型,但是没有使用线程池,而是由NioWorker类处理连接后...
**Reactor 模式简介**:Reactor 模型是一种常见的 I/O 多路复用技术,它的核心思想是通过注册事件到一个中央调度器(即 Reactor),当特定事件发生时,Reactor 会通知相应的处理程序去处理这些事件。这种模型非常...
Java网络编程领域中,...总的来说,Java的NIO和Netty框架是现代网络编程的重要工具,它们能够帮助开发者构建高并发、低延迟的网络应用。理解NIO的基本原理和Netty的高级特性,对于提升Java网络编程能力具有重大意义。
在多路复用I/O(如epoll、kqueue)中,Reactor模式是关键组成部分,它负责监听和分发事件到相应的处理器。Netty的Reactor模型主要由三部分组成:主线程(BossGroup)、工作线程(WorkerGroup)和事件循环(EventLoop...
在Java中,NIO(Non-blocking I/O)框架就是Reactor模式的一个典型应用,它允许一个线程处理多个通道(Channel)上的I/O事件,而不是为每个连接创建一个单独的线程。NIO中的Selector组件就是Reactor的核心,它能够...