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已经被关闭,再次调用该方法,没有任何作用。