知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。
一、非阻塞IO通道
非阻塞IO通道是处理非阻塞IO操作的必选技术点。
如:非阻塞方式读取和写入IO
1.1 Channel 是通道,不储存数据
1.2 Selector 监听channel激活状态,选择处理单元
1.3 处理单元可以丢到一个线程中进行处理,有效利用线程。每个输入Channel并不是时时刻刻都有数据上报到服务端,Selector只监听有效的channel,丢入到处理单元进行处理。
1.4 输入channel 和 输出channel 操作同一块buffer。
二、基本非阻塞IO通道架构设计
非阻塞IO通道可以使用单个线程来读取来自多个通道的数据。
设计处理通道设置成:非阻塞模式。
在非阻塞模式下,当尝试从中读取数据时,通道可能返回0或更多字节。
如果通道没有要读取的数据,则返回0字节。当通道实际上有一些要读取的数据时,返回大于1个字节。
为了避免检查要读取0字节的通道,我们使用Java NIO Selector 选择器。
SelectableChannel可以使用注册一个或多个实例Selector。
当你调用select()或调用selectNow()时,Selector它只给你SelectableChannel实际有数据读取的对象。
如下图:
三、实战环节
基于上图还可以把接收客户端连接放到接收线程中,selector选择处理模块,放入到处理线程中处理。
大致架构图:
3.1 接收客户端线程 SocketAccepter.java
3.2 处理线程 SocketProcessor.java
领取专属 10元无门槛券
私享最新 技术干货