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

我们在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java在线网页客服聊天_管理员消息java 网站用户在线和客服聊天

首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责这是应用到项目中的一个例子。实现原理是将信息存储到Application域里面。然后应用Struts2 Action 用json格式的数据停止前后台交互。截图:前台用户界面:后台客服界面:…

java语言的未来将去向何方?

Java在IT编程占有举足亲重的地位,那么很多小伙伴都关心Java的未来,未来java需求如何?java语言去向何方? Java的生态圈决定了这门语言在未来10年都会是最热门的语言之一,因为Java技术具有卓越的通用性、高效性、安全性…

JAVA计时函数的库_JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解...

1、UUID类库UUID 根据时间戳实现自动无重复字符串定义// 获取UUIDpublic static UUID randomUUID()// 根据字符串获取UUIDpublic static UUID fromString(String name)应用:对文件进行自动命名处理import java.util.UUID;class Demo {public static void main(Strin…

Java程序员越来越多工资反而越高?

Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序。Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾收集大大简化了程…

java fileinputstream.read(byte[])_Java分享笔记:FileInputStream流的 read()方法 和 read(byte[] b)方法...

1 /*------------------------ 2 FileInputStream: 3 ....//输入流,字节流 4 ....//从硬盘中存在的一个文件中读取内容,读取到程序中 5 ....//read()方法:从此输入流中读取一个数据字节 6 ....//read(byte[] b)方法:从此输入流中将…

10个理由告诉你为何要学Java编程?

为什么要学习Java编程语言?这个只要学习Java的小伙伴都会有答案,比如它的易学、面向对象,开源工具和库等。在Java中获得经验可以确保有一个收入丰厚的工作岗位。有一长串的编程语言仍然存在它们的优点和缺点,使我们的生活更容易。…

java股票数据_java抓取东方财富股票数据(附源码)

背景前段时间给朋友写了一个自动抓取同花顺股票数据的程序,不少人觉得不错。这几天后台有粉丝给我留言让我也抓一下东方财富的数据,说东方财富的数据特别难抓,我还真不一定能搞得定。本来我是一个德艺双磬且与世无争的佛系程序员,…

JDK文档是Java程序开发不可缺少的编程词典

Java 构建商业应用程序或者某种物联网设备,构建了Android 操作系统,它为智能手机行业做出了杰出的贡献。借助 Android 操作系统,手机厂商才得以在早期与黑莓抗衡,之后又能够打破苹果的主导地位。 JDK文档包含有关Java API、Java命…

java string 转 inputstream_String和inputstream互转【转文】

URLConnection urlConn url.openConnection(); // 打开网站链接sBufferedReader reader new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8")); // 实例化输入流,并获取网页代码String s; // 依次循环,至到读的值…

如何准备Java初级和高级技术的面试呢?

IT行业的崛起带动了一大批的新兴职业,Java数据开发就是其中之一,作为IT行业的刚需职位,企业对合格的Java开发人员求贤若渴, 在各大主流招聘平台上, Java相关职位数量一直名列前茅,那么我们如何准备Java初级和高级技术的面试呢&…

新手学完Java可以面试哪些岗位?

在这个个时代是互联网时代,也是JavaEE人才稀缺的时代。由于中国人才缺口比较大,JavaEE也迅速成为行业和市场的热点,更多的企业无论是对人才的招聘还是在培训都成了市场刚需,这也促使JavaEE人才的薪资在同岗位中是最高的&#xff0…

java adminlte 使用_AdminLTE2管理后台自定义

项目中需要用到 AdminLTE 管理后台模板,所以,这里对后台进行一个简单的布局修改,然后结合后端语言进行快速开发一个管理后台。一、示例后台布局这个示例后台带了许多开箱即用的脚手架,我们项目中只需要简单的东东,所以…

php rpoplpush,RPOPLPUSH命令_视频讲解_用法示例-redis编程词典-php中文网

pop英 [pɒp] 美 [pɑ:p]vi.(意外地、突然地)出现;突然出现;发出爆裂声;(突然地)行动vt.(突然地)伸出;(突然地)提出问题;(把准备好的东西)突然拿出来;敲击n.流行音乐;汽水;(尤用作称呼)爸;(迅速打上的)记号adj.流行音乐的;通俗风格的;通俗的;现代的adv.爆炸;砰地a…

php论坛系统教程,国内php原创论坛

国内php原创论坛发布时间:2016-06-17 来源: 点击:次国内php原创论坛 ofstar ctb wdb discuz fastboard之比较-----个人总结由于旅行的fastboard加密了就不做比较了--当然是款不错的程序下面的比较单从技术角度出发,不考虑个人专好,毕竟个人专好,因人而异…

学习Java编程面向对象的五大基本原则

Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心。围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范、继承是类与类之间联系的一种形式、而多态为系统组件或模块之间解耦提供了解决方案。 单一职责原则&…

php实现多条件查找分页,Yii2.0框架实现带分页的多条件搜索功能示例

本文实例讲述了Yii2.0框架实现带分页的多条件搜索功能。分享给大家供大家参考,具体如下:方法一在控制器中public function actionShow(){$where[title]Yii::$app->request->get(title);$where[content]Yii::$app->request->get(content);$qu…

小白学习Java技术知识点总结,其实学习Java没那么难

边学习边记录是程序员快速进步的途径,只有你不断累积知识,才能有质的飞跃,不断的coding,累积经验。 第一讲,主要是Java环境变量的配置。 搭建好环境才能干活。要理解什么是编译、什么是运行。编译是Javac.exe程序在负…

php二维数组 xml,xml 怎样通过php解析到二维数组里面

localhost1root123<?php $doc new DOMDocument(1.0,utf-8); $doc->load("config.xml"); $roots$doc->documentElement;//获取根节点也就是config(仅有一个) $childs$roots->childNodes;//获取根节点下所有子节点也就是 db smarty for($i0;$ilength;$i)…

为什么说Java 程序员必须掌握 Spring Boot?

大部分人选择学习Java&#xff0c;自然是因为看上了Java的薪资待遇,java的地位可谓在编程界属于大佬&#xff0c;最近Spring Boot 2.0 的推出来后&#xff0c;又激起了一阵学习 Spring Boot 的热潮&#xff0c;那么&#xff0c; 使用 Spring Boot 会带来什么样的变革?一起来了…

matlab实现图片区水印,怎么在含有水印的图像中提取出水印

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼%水印嵌入代码M 256;%原始图像长度N 32; %水印图像长度K 8;I zeros(M, M);J zeros(N, N);BLOCK zeros(K, K);%显示原始图像subplot(221);I imread(C:\Users\Rocky\Documents\MATLAB\cameraman.bmp);imshow(I);title(原始图像…