NIO模型学习笔记
NIO模型学习笔记
简介
Non-blocking I/O 或New I/O
自JDK1.4开始使用
应用场景:高并发网络服务器支持
概念理解
模型:对事物共性的抽象
编程模型:对编程共性的抽象
BIO网络模型
阻塞IO
BIO连接过程
1、监听建立连接请求
2、发起建立连接请求
3、服务端启动新线程
4、线程响应客户端
5、等待客户端再次请求
BIO网络模型缺点
- 阻塞式IO模型
- 弹性伸缩能力差
- 多线程耗资源
NIO网络模型
特点
非阻塞IO
弹性伸缩能力强
单线程节省资源
模型图

核心类
Channel:通道
特点:
- 双向性:可读可写
- 非阻塞性
- 操作唯一性:只能通过Buffer操作Channel
实现
- 文件类:FileChannel
- UDP类:DatagramChannel
- TCP类:ServerSocketChannel/SocketChannel
Buffer:缓冲区
作用:读写Channel中数据
本质:一块内存区域
属性
- Capacity:容量(相当于数组的长度)
- Position:位置(相当于数组的角标)
- Limit:上限(写模式下,limit=Capacity,读模式下,limit=从buffer中最多读取的数量)
- Mark:标记
Selector:选择器或多路复用器
作用:IO就绪选择
地位:NIO网络编程的基础
SelectionKey简介
- 四种就绪状态常量
- 有价值的属性
NIO编程实现步骤
服务端步骤
- 第一步:创建Selector
- 第二步:创建ServerSocketChannel,并绑定监听端口
- 第三步:将Channel设置为非阻塞模式
- 第四步:将Channel注册到Selector上,监听连接事件
- 第五步:循环调用Selector的select方法,检测就绪情况
- 第六步:调用SelectedKeys方法获取就绪channel集合
- 第七步: 判断就绪事件种类,调用业务处理方法
- 第八步:根据业务需要决定是否再次注册监听事件,重复执行第三步操作
客户端步骤
- 连接服务器端
- 向服务器端发送数据
- 接收服务器端的响应
NIO网络编程缺陷
- 麻烦:NIO类库和API繁琐
- 心累:工作量和难度较大
- 有坑:Selector空轮训,导致CPU100%
NIO模型学习笔记的更多相关文章
- 概率图模型学习笔记:HMM、MEMM、CRF
作者:Scofield链接:https://www.zhihu.com/question/35866596/answer/236886066来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...
- Pytorch线性规划模型 学习笔记(一)
Pytorch线性规划模型 学习笔记(一) Pytorch视频学习资料参考:<PyTorch深度学习实践>完结合集 Pytorch搭建神经网络的四大部分 1. 准备数据 Prepare d ...
- LDA主题模型学习笔记5:C源代码理解
1.说明 本文对LDA原始论文的作者所提供的C代码中LDA的主要逻辑部分做凝视,原代码可在这里下载到:https://github.com/Blei-Lab/lda-c 这份代码实现论文<Lat ...
- HMM模型学习笔记(前向算法实例)
HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...
- 微软CodeDom模型学习笔记(全)
CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. ...
- GAN︱生成模型学习笔记(运行机制、NLP结合难点、应用案例、相关Paper)
我对GAN"生成对抗网络"(Generative Adversarial Networks)的看法: 前几天在公开课听了新加坡国立大学[机器学习与视觉实验室]负责人冯佳时博士在[硬 ...
- Java NIO 完全学习笔记(转)
本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ...
- Java NIO 核心组件学习笔记
背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...
- Java NIO、NIO.2学习笔记
相关学习资料 http://www.molotang.com/articles/903.html http://www.ibm.com/developerworks/cn/education/java ...
随机推荐
- dubbo漫谈二
转:腾信视频 阿甘 https://ke.qq.com/course/216518 https://blog.csdn.net/u013142781/article/details/50396621 ...
- php面试专题---5、流程控制考点
php面试专题---5.流程控制考点 一.总结 一句话总结: 看代码不要先看函数里面的内容,要用的时候再去看:注意静态,注意变量作用域,php中的内置函数需要去归类总结,就是太容易忘记了 1.写出如下 ...
- CentOS 7在VMware 12中共享文件看不见的问题?
前言 由于rhel 7.2因为没有注册导致yum无法使用,包括自己配置本地源,这个命令在你没有注册都不能使用,每次使用rpm去装软件,自己去找缺少的依赖包,实在是麻烦.于是不如就换一个系统,CentO ...
- (62)C# 动态绑定
动态绑定不能绕过成员可访问性的规则
- 进程管理工具-Supervisord 使用
简介 Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动.重启(自动重启程序).关闭进程(不仅仅是 Pytho ...
- android SlidingDrawer
SlidingDrawer把内容从屏幕上隐藏,允许用户拖动把手将内容显示到屏幕.SlidingDrawer可用于垂直或水平.它由两个视图组成的:handle,让用户拖拉的;content,连在hand ...
- Reciting(third)
It is subtly demonstrate in the portrayal that a teacher is teaching mathmatics in a certain class ...
- Java + selenium window()接口方法介绍
在浏览器启动的代码中,有一段关于window接口的调用,这篇文章就是来解释介绍这个接口的.代码如下 driver.manage().window().maxmize(); window接口主要是用来控 ...
- T1215:迷宫
[题目描述] 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某 ...
- git使用记录七:对工作区和暂存区的一些操作场景
比较暂存区和HEAD所含文件的差异? 操作场景如下: 修改readme.md 文档 vi readme.md 加入到暂存区域 git add readme.md 使用git diff -cached ...