【Java.NIO】Channel,Selector,SelectionKey以及应用实例

本文介绍了Java NIO中的Selector组件及其工作原理。Selector能够监控多个NIO通道上的事件,如读写等,并允许单一线程管理多个网络连接。文章详细讲解了Selector的创建、通道注册、事件检测等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接

 

1.NIO的通讯过程:

 

过程:NIO实现了IO多路复用的Ractor模型,一个线程Thread使用一个选择器Selector通过轮询的方式去监听多个通道Channel上的事件,找到IO事件已经到达的Channle执行。

原因(好处):因为创建和切换线程的开销很大,因此使用一个线程来处理多个事件而不是一个线程处理一个事件,具有更好的性能

 

 

2.Selector的创建

通过调用Selector.open()方法创建一个Selector,

 

Selector selector = Selector.open();

 

  • isOpen() —— 判断Selector是否处于打开状态。Selector对象创建后就处于打开状态了
  • close() —— 当调用了Selector对象的close()方法,就进入关闭状态.。用完Selector后调用其close()方法会关闭该Selector,且使注册到该Selector上的所有SelectionKey实例无效。通道本身并不会关闭

 

 

3.向Selector注册通道

为了将Channel和Selector配合使用,必须将channel注册到selector上。

通过SelectableChannel的register()方法来实现。

 

4.register()返回值 —— SelectionKey,  Selector中的SelectionKey集合

只要ServerSocketChannel及SocketChannel向Selector注册了特定的事件,Selector就会监控这些事件是否发生

SelectableChannel的register()方法返回一个SelectionKey对象,该对象是用于跟踪这些被注册事件的句柄

一个Selector对象会包含3种类型的SelectionKey集合:

  • all-keys集合 —— 当前所有向Selector注册的SelectionKey的集合,Selector的keys()方法返回该集合
  • selected-keys集合 —— 相关事件已经被Selector捕获的SelectionKey的集合,Selector的selectedKeys()方法返回该集合
  • cancelled-keys集合 —— 已经被取消的SelectionKey的集合,Selector没有提供访问这种集合的方法

 </

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值