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没有提供访问这种集合的方法
</