当前位置:网站首页>NIO's Selector execution process
NIO's Selector execution process
2022-08-02 21:04:00 【i attack siege lion】
一、Seletor是什么?
selector 单从字面意思不好理解,Seletor是一个监听器,它可以监听Channel中发生的事件.Channelcan be registered atSeletor中,when these are registeredChannel在事件发生时,Seletor的select 方法就会返回这些事件交给 thread 来处理.
二、Seletordifference from multithreading
It is not easy to understand just from the above explanation,需要结合服务器的设计演化来理解它的用途
多线程版设计
to clients in the networksocket请求,If each request opens a thread to handle,Then the system memory usage is high,Thread context switching costs are also high,The stress on the system can be very high.
线程池版设计
使用线程池,Optimized thread creation,But in blocking mode,线程仅能处理一个 socket 连接, 仅适合短连接场景
selector版本
selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上.适合连接数特别多,但流量低的场景(low traffic)
三、selector单线程处理多socket案例
服务端代码:
@Slf4j
public class ChannelDemo6 {
public static void main(String[] args) {
try (ServerSocketChannel channel = ServerSocketChannel.open()) {
channel.bind(new InetSocketAddress(8080));
System.out.println(channel);
Selector selector = Selector.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
int count = selector.select();
log.debug("select count: {}", count);
// 获取所有事件
Set<SelectionKey> keys = selector.selectedKeys();
// 遍历所有事件,逐一处理
Iterator<SelectionKey> iter = keys.iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
// 判断事件类型
if (key.isAcceptable()) {
ServerSocketChannel c = (ServerSocketChannel) key.channel();
// 必须处理
SocketChannel sc = c.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
log.debug("连接已建立: {}", sc);
}
else if (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(128);
int read = sc.read(buffer);
if(read == -1) {
key.cancel();
sc.close();
} else {
buffer.flip();
debugAll(buffer);
}
}
// 处理完毕,必须将事件移除
iter.remove();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8080)) {
System.out.println(socket);
socket.getOutputStream().write("world".getBytes());
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法解释:
- ServerSocketChannelused to create the serverChannel,它有点像ServerSocket.
- channel.configureBlocking(false);设置channel为非阻塞,这样如果accpet的时候,如果没有连接,就会返回null.
- channel.register(selector, SelectionKey.OP_ACCEPT)将channel注册到selector中,监听accept连接事件
- selector.select(),会阻塞,等待客户端连接
- selector.selectedKeys(),event production,will add events to this collection
四、selector事件
- accept Fired when a connection is made
- connect Fired when a client establishes a connection
- read Raises a readable event when a client message is received
- 可写事件
边栏推荐
- 仿制药的未来商机--个人研发的体会
- 面试官:可以谈谈乐观锁和悲观锁吗
- 中断向量表概述
- 指针常量和常量指针概述
- 洛谷P1502 窗口的星星
- 如何应对机器身份带来的安全风险
- 来亲自手搭一个ResNet18网络
- E-Surfing Cloud 4.0 Distributed Cloud Enables Digital Transformation of Thousands of Industries
- 查看数据库数据量大小,占用磁盘大小
- Taking advantage of cloud-network integration, e-Surfing Cloud has paved the way for digital transformation for government and enterprises
猜你喜欢
NeRF: The Secret of 3D Reconstruction Technology in the Popular Scientific Research Circle
Enterprise cloud cost control, are you really doing it right?
Open Source Summer | [Cloud Native] DevOps (5): Integrating Harbor
天翼云4.0来了!千城万池,无所不至!
Win11主题下载一直转圈怎么办?Win11主题下载一直转圈的解决方法
Why young people are snapping up domestic iPhone, because it is much cheaper and more populist
千万级别的表分页查询非常慢,怎么办?
LeetCode 2349. 设计数字容器系统(SortedSet)
LeetCode 2333. 最小差值平方和(贪心)
C#里如何简单的校验时间格式
随机推荐
C# 术语
千万级QPS下服务如何才能平滑启动
[深入研究4G/5G/6G专题-49]: 5G Link Adaption链路自适应-5-上行链路自适应ULLA-PUSCH信道
监控易火星版即将亮相:分布式运维帮助TOP3000大企业跨越管理鸿沟
多聚体/壳聚糖修饰白蛋白纳米球/mPEG-HSA聚乙二醇人血清白蛋白纳米球的制备与研究
洛谷P2880 Balanced Lineup G
DevOps之代码检查
HDF驱动框架的API(1)
LiveGBS国标GB/T28181流媒体平台支持主子码流切换主码流stream/streamprofile
洛谷P4799 世界冰球锦标赛
【软考软件评测师】基于经验的测试技术
洛谷P1966 火柴排队
Gear 月度更新|6 月
Open Source Summer | [Cloud Native] DevOps (5): Integrating Harbor
透过案例看清API接口的作用——演示1688商品详情接口
玩转云端 | 天翼云对象存储ZOS高可用的关键技术揭秘
How a "cloud" can bring about new changes in the industry
电子行业库存管理痛点与WMS仓储管理系统解决方案
Go 语言快速入门指南:第二篇 变量与常量
针对时间的功能测试点,这里给你总结全面了