NIO的工作原理

NIO介绍

1) Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出 的新特性,被统称为 NIO(即 New IO),是同步非阻塞的
2) NIO 相关类都被放在 java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写。
3) NIO 有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器)
4) NIO是 面向缓冲区 ,或者面向 块 编程的。数据读取到一个 它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就 增加了处理过程中的灵活性,使用它可以提供非阻塞式的高 伸缩性网络
5) Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得 到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线 程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞 写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这 个线程同时可以去做别的事情。
6) 通俗理解:NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来, 根据实际情况,可以分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分 配10000个。
7) HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求 的数量比HTTP1.1大了好几个数量级。

NIO 三大核心原理示意图

在这里插入图片描述

	 Selector 、 Channel 和 Buffer 的关系
		1) 每个channel 都会对应一个Buffer
		2) Selector 对应一个线程, 一个线程对应多个channel(连接)
		3) 该图反应了有三个channel 注册到 该selector //程序
		4) 程序切换到哪个channel 是有事件决定的, Event 就是一个重要的概念
		5) Selector 会根据不同的事件,在各个通道上切换
		6) Buffer 就是一个内存块 , 底层是有一个数组
		7) 数据的读取写入是通过Buffer, 这个和BIO , BIO 中要么是输入流,或者是 输出流, 不能双向,但是NIO的Buffer 是可以读也可以写, 需要 flip 方法切换
		8) channel 是双向的, 可以返回底层操作系统的情况, 比如Linux , 底层的操作系统 通道就是双向的

NIO 非阻塞 网络编程原理分析图

在这里插入图片描述

1. 当客户端连接时,会通过 ServerSocketChannel 得到 SocketChannel 
2. Selector 进行监听 select 方法, 返回有事 件发生的通道的个数. 
3. 将socketChannel注册到Selector上, register(Selector sel, int ops), 一个 selector上可以注册多个SocketChannel 
4. 注册后返回一个 SelectionKey, 会和该 Selector 关联(集合) 
5. 进一步得到各个 SelectionKey (有事件发生) 
6. 在通过 SelectionKey 反向获取 SocketChannel , 方法 channel() 
7. 可以通过得到的 channel , 完成业务处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxtx-0510

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值