我们在IO模型和Java网络编程模型中,对IO有了一定的理解。这一篇,主要讲解基于事件驱动的两种是在原来基础上的扩展。在基于事件驱动的网络编程模型中,Reactor和Proactor模型是两种常用的IO设计模型。

我们知道BIO(阻塞IO)只有等待阻塞方法结束了,操作权才会交还给调用线程,在阻塞期间,调用者做不了任何操作,只能等待。在此期间调用者线程无法转向其他能做的事,对调用者来讲,这其实是一种浪费。在NIO(非阻塞IO)中,非阻塞IO会立刻将结果返回到调用者,调用者获取结果无需等待。获得的结果无非两种:数据准备好了,你继续表演吧;要么数据还没准备好,你要不再试试,或者你等会再试试。而对AIO(异步IO),调用方立刻获得返回,并且操作系统会使用另外的资源来达成此次的IO请求,并在操作系统完成数据准备后,通知调用者。

Reactor模式和Proactor模型

Reactor模型的中心思想采用的就是我们在IO模型和Java网络编程模型中所讲的多路复用IO。Reactor模型主要包含以下几个角色:

1)Handle,也叫句柄,有些地方也叫描述符。如网络Socket IO中称网络IO句柄或者Socket描述符,在文件读写中称文件IO句柄或者文件描述符等。

2)Synchronous Event Demultiplexer,也称同步事件多路分解器,用于阻塞等待发生在句柄集合上的一个或者多个事件,因为事件的到来是随机不可预测的,底层要实现事件的监听采取的是循环等待的策略,这种策略也叫事件循环。事件循环依赖系统调用,这里的系统调用,指的就是select/poll/epol等底层函数。这些底层函数一旦监听到句柄(或描述符)的读就绪或者写就绪,就会通知调用方进行读写操作。同步事件分离器依赖底层系统调用的实现。

3)Event Handler, 可称为事件处理器,不同的事件,可以有不同的处理器。通常IO框架库会将事件处理器定义成一个模板函数,不同的事件处理器可以有不同的特性,拥有自己业务相关的实现。

4)Reactor,也称为反应器,反应器主要功能包括以下:注册或者删除应用程序所关注的事件句柄,运行事件循环监控事件的到来,当事件到达时,反应器分离事件,并通知到对应的具体的事件处理器上,由具体的事件处理器处理器调用相关的函数来实现数据的读或者写,处理完数据后,交还系统的控制权。

Reactor模型图

整体的业务流可以概括为,首先调用者先向反应器注册,其对某种具体 的IO动作感兴趣,反应器会循环监控调用 者注册的事件是否已发生(如可读可写等),当事件发生后,事件分解器就被唤醒,会通知到事件对应的处理器来完成 事件的读写,可以看出,在具体事件到达时,处理程序不是调用的反应器,而是通过反应器分离的事件处理器来作数据的读或者写,这种方式又被称为“好莱坞法则”,类似于好莱坞大导演找演员的模型,你别来找我,等活来了我来找你吧。Reactor模型当有对应的IO完成时,回调对应的函数来处理,这种模型本质上还是一种同步的IO模型,其底层也并没有调用对应的异步IO的函数。

Reactor模型中的事件处理器是基于模板的模型来实现的,这意味着不同的事件处理器是分离的,业务间具体低侵入性。Reactor模型的底层系统调用也是一个模板模型,可以用select实现,亦或epoll,但是必须满足能监控活跃连接的功能。

Proactor与Reactor则不同,Reactor是基于同步IO模型实现的,而Proactor是基于异步IO。

Proactor中,调用者会调用异步操作处理器提供的异步函数,调用之后, 调用者线程和异步操作处理器会独立运行,这依赖于操作系统对异步IO的支持,实际的IO是由操作系统来完成 的。然后Proactor会进行事件循环,等待事件的到来 ,当事件分解器等待事件到来的同时,操作系统已经在同时将目标数据拷备到用户空间,当拷备完成 后,会通知到事件分解器,事情已经搞完了,事件分解器将完成事件转发到相应的事件处理者或者 回调函数,调用 者就可以利用这些数据处理自己的业务逻辑 了。

Reactor和Proactor都是对某个具体IO事件的告知,这也就我们所说的基于事件驱动,Reactor是告知的事件已准备好,而Proactor是事件已做好。他们的业务 逻辑也很类似,都是事件分解器来负责IO的监控,并回调对应的事件处理器,不同之处在于Reactor事件告知的是已准备好,还需要进一步的从内核 空间数据拷备到用户空间。而Proactor是数据已经准备好,调用 者可以直接在用户空间使用了。

       为了让学习变得轻松、高效,今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要入门的资料欢迎加入学习交流群:9285,05736

Java程序员需要了解的两种服务器设计模型相关推荐

  1. Java程序员如何月薪达到两万,需要技术水平达到什么程度?

    有人说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为除了北上广深杭,其他地方也很难达到 ...

  2. idea中java程序打jar包的两种方式(超详细)

    java程序打成的jar包有两种类型,一种是可直接执行的runnable jar文件,另一种是包含多个主类,运行时需要指定主类全类名的jar包,下面我们细说在idea中两种jar包的打包方法及执行ja ...

  3. Java程序员应该了解的10个设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  4. 没有学历文凭,如何成为一名优秀的 Java 程序员?

    作为编程语言界的常青藤 Java,无论是在企业级应用,还是后端开发中,均有着无可替代的地位.而对于 Java 的入门,很多新手们不可避免的会走一些弯道.那么,如何才能有效地避开这些误区?又该如何快速实 ...

  5. java原生的编译软件_原生态Java 程序员容易忽视的编程细节

    Java是Java程序设计语言和Java平台的总称,要想学好一门语言,打好基础最关键的,学习一种新的编程语言比学习新的口头语言要容易得多.然而,在这两种学习过程中,都要付出额外的努力去学习不带口音地说 ...

  6. Java程序员的互联网转型之路

    08年毕业跑到上海,在经济危机最热闹的一年找到份勉强活下去的java研发工作,从此开始了漫长的通信行业软件开发.几年间身边的同事跳槽到互联网行业,也有新鲜血液补充进来,总体来说人员质量是在不断下降的. ...

  7. 程序员用学位证吗_没有学位如何成为一名优秀的Java程序员

    程序员用学位证吗 掌握Java的道路是漫长而棘手的. 但是,在我从事编码工作的那几年中,我获得了一两个提示. 但是,如何成为一名优秀的Java程序员不是一个简单的问题? 您不需要任何正式培训. 您无需 ...

  8. 没有学历文凭,如何成为一名优秀的 Java 程序员

    "如何成为一名优秀的Java程序员"不是只字片语就能回答清楚的.没有相关的学位证书,你也可以被称为一名优秀的Java程序员. 你只需集中精力,主动利用网上丰富的资源,投入足够的时间 ...

  9. Java程序员应在2018年学习的3种JVM语言

    如果您是Java程序员,并且想学习更多的编程语言以扩展您的知识和技能,但是不确定选择哪种编程语言,那么您来对地方了. 在本文中,我将分享Java程序员可以在2018年学习的3种JVM语言以及为什么要学 ...

最新文章

  1. 一网打尽当下NoSQL类型、适用场景及使用公司
  2. 了解Exchange server 2010角色
  3. STM32F103+UCOS-II 实现临界区不关闭重要中断
  4. 浅析在公众号中使用弛声sdk为什么上传解析慢
  5. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球
  6. 分布式与人工智能课程(part13)--模型验证
  7. 科大讯飞2021笔试题
  8. css-模态对话框的制作
  9. 如何在.NET中启用程序集绑定失败日志记录(Fusion)
  10. webpack4.0学习笔记
  11. web前端项目实例网站_2020最全web前端项目实战课程(含项目实战+源码)
  12. 虚拟仿真实验室管理系统
  13. win10自带虚拟机 Hyper-V下载和安装linux系统
  14. kotlin android 开源,Kotlin开源项目集合
  15. 2021-5-11 atcoder C - Replacing Integer
  16. Android Studio 加载arr文件.arr文件
  17. 爬取动漫美女,手把手教你用Python网络爬虫获取动漫图片
  18. 阿里P9:做了6年架构设计,这次聊聊微服务与分布式事务细节
  19. npm ERR! code ENOENT npm ERR! syscall open npm ERR! path E:\jd\pro1\ka-mrm-jd_intern\package.json np
  20. DOTA的常用礼仪用语及英文缩写

热门文章

  1. mysql表不存在_MySQL表不存在。但这确实(或者应该如此)
  2. mariadb使用mysql驱动_MariaDB安装与使用
  3. python函数递归法求一个数各位数之和_python – 设计一个使用digit_sum计算数字总和的递归函数...
  4. MATLAB imshow之后在四周加上边框
  5. TypeError: 'numpy.ndarray' object is not callable
  6. python读取图像矩阵文件并转换为向量
  7. OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
  8. 权限列表(包字典)递归成树状结构
  9. 以LeNet-5为例理解CNN
  10. android之常用知识点(一)