当前位置: 首页 > 工具软件 > open-selector > 使用案例 >

nio - Selector

柴嘉石
2023-12-01


Selector

SelectableChannel对象的多路复用器 (multiplexor)。


Selector selector = Selector.open();

创建一个Selector或者打开一个Selector。

实际上是调用SelectorProvider.provider().openSelector(),得到的是KQueueSelectorImpl对象。


boolean isOpen = selector.isOpen();

判断Selector是否被打开。


SelectorProvider selectorProvider = selector.provider();

获取对应的SelectorProvider。

实际上得到的是KQueueSelectorProvider对象。


Set<SelectionKey> keys = selector.keys();

获取该Selector关联的已注册的SelectionKey集合。

不可以直接修改该SelectionKey集合,只有当SelectionKey取消或者Channel取消注册时,SelectionKey才可以从集合中删除。否则会抛出UnsupportedOperationException异常。


Set<SelectionKey> selectedKeys = selector.selectedKeys();

获取该Selector关联的已选择的SelectionKey集合。

可以删除,但是不可以直接添加。否则会抛出UnsupportedOperationException异常。


int numKeys = selector.selectNow();

选择对应的Channel对于I/O操作就绪的SelectionKey的个数。

非阻塞式。调用这个方法会清除之前的wakeup()方法的带来的影响。


int numKeys = selector.select();
int numKeys = selector.select(3000);

选择对应的Channel对于I/O操作就绪的SelectionKey的个数。

阻塞式。只有选择出至少一个Channel、调用该Selector#wakeup()方法、当前线程被中断、(给定时间超时),这个方法才会返回。


selector.wakeup();

使第一个还没有返回的选择操作立即返回。

如果另一个线程当前被select()或者select(long)方法阻塞,调用这个wakeup()方法,会立即返回。
如果当前没有select操作,那么下一次的select()或者select(long)方法会立即返回。


selector.close();

关闭该Selector。

任何与该Selector关联的还未取消的SelectionKey会失效,Channel会取消注册,关联的资源也会被释放。

如果一个Selector已经被关闭,再次调用该方法,没有任何作用。

 类似资料: