Selector机制之Selector.open()函数的解析
在NIO中我们一般都是Channel与Selector配合使用的,一般情况下使用的方法如下:
//打开Selector来处理channel
Selector selector = Selector.open();
//将channel注册到selector中,并将channel设置成等待新的连接
serverChannel.register(selector,SelectionKey.OP_ACCEPT);
//等待处理新的事件;一直阻塞直到下一个事件到来才唤醒.此方法执行处于阻塞模式的选择操作。仅在至少选择一个通道、调用此选择器的 wakeup 方法,或者当前的线程已中断(以先到者为准)后此方法才返回。
selector.select();
这篇博客我们主要从Selector.open()函数开始,一步步分析Selector机制。
首先我们进入Selector.open();函数,在JDK源码中定义如下:
public static Selector open() throws IOException {
return SelectorProvider.provider().openSelector();
}
查看这个函数的doc文档注释:
The new selector is created by invoking the openSelector method of the system-wide default SelectorProvider object.
意思是:通过调用系统默认的SelectorProvider(这里不同的系统会有不同的SelectorProvider实现类)的openSelector()方法来创建新的