《Java 源码分析》 :Java NIO 之 Selector(第一部分Selector.open())
关于Selector类主要涉及两个重要的方法,如下:
1、Selector.open()
2、select()
由于篇幅限制,这篇主要从源码的角度来介绍Selector selector = Selector.open()背后主要做了什么,发生了什么。
Selector类中的open()源码如下:
public static Selector open() throws IOException {
return SelectorProvider.provider().openSelector();
}
函数功能:打开一个选择器。这个新的选择器的是通过调用系统级默认 SelectorProvider 对象的 openSelector 方法来创建的。
SelectorProvider.provider().openSelector();这行代码中我们先看SelectorProvider.provider();具体做了些什么。
provider()方法的源码如下:
public static SelectorProvider provider() {
synchronized (lock) {
if (provider != null)//保证只有一个provider对象实例
return provider;
return AccessController.doPrivileged(
new PrivilegedAction<SelectorProvider>() {
public SelectorProvider run() {
if (loadProviderFromProperty())
return provider;
if (loadProviderAsService())
return provider;
provider = sun.nio.ch.DefaultSelectorProvider.create();
return provider;
}
});
}
}
此函数功能:返回此时调用JVM的系统级默认的SelectorProvider
在代码中
而if (provider != null)
returnprovider;
是用来保证了整个程序中只有一个WindowsSelectorProvider对象;
由于我自己看的源码不是openjdk,因此在类库中根本就没有sun.nio.ch这个包。
在这里可以看到:http://www.docjar.com/html/api/sun/nio/ch/DefaultSelectorProvider.java.html。或者是直接下载openjdk来进行源码的追踪。
provider由sun.nio.ch.DefaultSelectorProvider.create();创建
sun.nio.ch.DefaultSelectorProvider类的源码如下:
/**
* Creates this platform's default SelectorProvider
*/
public class DefaultSelectorProvider {
/**
* Prevent instantiation.
*/
private DefaultSelectorProvider() { }
/**
* Returns the default SelectorProvider.
*/
public static SelectorProvider create() {
return new sun.nio.ch.WindowsSelectorProvider();
}
}
所以从上面我们就可以看到:DefaultSelectorProvider 类只有一个私有的构造函数和一个create方法。其中在类 SelectorProvider 中的provider()方法中
provider = sun.nio.ch.DefaultSelectorProvider.create();会根据操作系统来返回不同的实现类,windows平台就返回WindowsSelectorProvider对象实例