星球狂想战队|深度解读Netty:NIO那些不为人知的秘密( 三 )
JavaNIO
NIO(NewIO或者No-BlockingIO) , 从JDK1.4开始引入的非阻塞IO , 是一种非阻塞+同步的通信模式 。 这里的NoBlockingIO用于区分上面的BIO 。
NIO本身想解决BIO的并发问题 , 通过Reactor模式的事件驱动机制来达到NonBlocking的 。 当socket有流可读或可写入socket时 , 操作系统会相应的通知应用程序进行处理 , 应用再将流读取到缓冲区或写入操作系统 。
也就是说 , 这个时候 , 已经不是一个连接就要对应一个处理线程了 , 而是有效的请求 , 对应一个线程 , 当连接没有数据时 , 是没有工作线程来处理的 。
当一个连接创建后 , 不需要对应一个线程 , 这个连接会被注册到多路复用器上面 , 所以所有的连接只需要一个线程就可以搞定 , 当这个线程中的多路复用器进行轮询的时候 , 发现连接上有请求的话 , 才开启一个线程进行处理 , 也就是一个请求一个线程模式 。
NIO提供了与传统BIO模型中的Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道实现 , 如下图结构所示 。 这里涉及的Reactor设计模式、多路复用Selector、Buffer等暂时不用管 , 后面会讲到 。
AIO方式使用于连接数目多且连接比较长(重操作)的架构 , 比如相册服务器 , 充分调用OS参与并发操作 , 编程比较复杂 , JDK7开始支持 。
目前来说AIO的应用还不是很广泛 , Netty之前也尝试使用过AIO , 不过又放弃了 。
二、NIO核心组件介绍1.Channel
在NIO中 , 基本所有的IO操作都是从Channel开始的 , Channel通过Buffer(缓冲区)进行读写操作 。
read()表示读取通道中数据到缓冲区 , write()表示把缓冲区数据写入到通道 。
【星球狂想战队|深度解读Netty:NIO那些不为人知的秘密】2.Buffer
概念
Buffer也被称为内存缓冲区 , 本质上就是内存中的一块 , 我们可以将数据写入这块内存 , 之后从这块内存中读取数据 。 也可以将这块内存封装成NIOBuffer对象 , 并提供一组常用的方法 , 方便我们对该块内存进行读写操作 。
推荐阅读
- 游戏小怪兽|达仁星球:最新抖音直播留人控场方法和技巧
- 巅峰战队|VERTIX户外手表,勇攀新高峰——COROS
- 星球狂想战队|世界科技格局
- 家族战队|10年后退化成了“简陋版”,快看丨腾讯微博将于9月28日停服
- 路人战队|失去苹果的代价,有300万人承担不起,请别口嗨“抵制苹果”了
- 家族战队|就读懂了湖南互联网产业,读懂了这些话
- 路人战队|雷军用了什么法宝?,超越格力?新型洗烘一体机实现“弯道超车”
- NASA|NASA发现“黄金星球”,价值超万万亿美元,美国已准备前往
- 天文在线|既有大气又有水 宝藏星球土卫六,宇宙中的超级泰坦
- 通天战队|别人偷动你手机,屏幕就会一戳一个洞,只有你可以打开,教你一招