package java.nio.channels.spi;
import java.io.IOException;
import java.net.ProtocolFamily;
import java.nio.channels.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Iterator;
import java.util.ServiceLoader;
import java.util.ServiceConfigurationError;
import sun.security.action.GetPropertyAction;
/**
* Service-provider class for selectors and selectable channels.
*这是一个selector和可选择的channel的服务提供类
* <p> A selector provider is a concrete subclass of this class that has a
* zero-argument constructor and implements the abstract methods specified
* below. A given invocation of the Java virtual machine maintains a single
* system-wide default provider instance, which is returned by the {@link
* #provider() provider} method. The first invocation of that method will locate
* the default provider as specified below.
*selector的提供者就是这个类的一个具体实现子类,他有一个无参的构造器和对下面的抽象方法的实现,一个特定的JVM的调用会保持着(返回)一个系统范围内的默认的的服务实例,
*可以通过provider()方法返回。这个方法的第一次调用会按照下面的说明定位到一个默认的提供者
* <p> The system-wide default provider is used by the static <tt>open</tt>
* methods of the {@link java.nio.channels.DatagramChannel#open
* DatagramChannel}, {@link java.nio.channels.Pipe#open Pipe}, {@link
* java.nio.channels.Selector#open Selector}, {@link
* java.nio.channels.ServerSocketChannel#open ServerSocketChannel}, and {@link
* java.nio.channels.SocketChannel#open SocketChannel} classes. It is also
* used by the {@link java.lang.System#inheritedChannel System.inheritedChannel()}
* method. A program may make use of a provider other than the default provider
* by instantiating that provider and then directly invoking the <tt>open</tt>
* methods defined in this class.
*这个系统范围内的提供者被一些 公开的静态方法所使用,例如selector.open(),serverSocketChannel.open()等等,
*应用也可能会确定一个提供者,而不是使用默认的提供者,通过实例化那个provider,然后直接调用定义在这个勒种的open方法即可获得。
* <p> All of the methods in this class are safe for use by multiple concurrent
* threads. </p>
*这个类所有的方法都是线程安全的
*
* @author Mark Reinhold
* @author JSR-51 Expert Group
* @since 1.4
*/
public abstract class SelectorProvider {
private static final Object lock = new Object();
private static SelectorProvider provider = null;
/**
* Initializes a new instance of this class. </p>
*
* @throws SecurityException
* If a security manager has been installed and it denies
* {@link RuntimePermission}<tt>("selectorProvider")</tt>
*/
protected SelectorProvider() {
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new RuntimePermission("selectorProvider"));
}
private static boolean loadProviderFromProperty() {
String cn = System.getProperty("java.nio.channels.spi.SelectorProvider");
if (cn == null)
return false;
try {
Class<?> c = Class.forName(cn, true,
ClassLoader.getSystemClassLoader());
provider = (SelectorProvider)c.newInstance();
return true;
} catch (ClassNotFoundException x) {
throw new ServiceConfigurationError(null, x);
} catch (IllegalAccessException x) {
throw new ServiceConfigurationError(null, x);
} catch (InstantiationException x) {
throw new ServiceConfigurationError(null, x);
} catch (SecurityException x) {
throw new ServiceConfigurationError(null, x);
}
}
private static boolean loadProviderAsService() {
ServiceLoader<SelectorProvider> sl =
ServiceLoader.load(SelectorProvider.class,
ClassLoader.getSystemClassLoader());
Iterator<SelectorProvider> i = sl.iterator();
for (;;) {
try {
if (!i.hasNext())
return false;
provider = i.next();
return true;
} catch (ServiceConfigurationError sce) {
if (sce.getCause() instanceof SecurityException) {
// Ignore the security exception, try the next provider
continue;
}
throw sce;
}
}
}
/**
* Returns the system-wide default selector provider for this invocation of
* the Java virtual machine.
*一个JVM的调用将会返回系统范围内默认的selector提供者
* <p> The first invocation of this method locates the default provider
* object as follows: </p>
*这个方法的第一次调用将会安装下面的顺序定位到默认的提供者
* <ol>
*
* <li><p> If the system property
* <tt>java.nio.channels.spi.SelectorProvider</tt> is defined then it is
* taken to be the fully-qualified name of a concrete provider class.
* The class is loaded and instantiated; if this process fails then an
* unspecified error is thrown. </p></li>
* 如果系统属性中定义了一个java.nio.channels.spi.SelectorProvider的属性,他就会被配置成一个具体的提供类的类全名,
* 这个类会被加载和安装,如果这个过程失败,就抛出一个未定义的错误
* <li><p> If a provider class has been installed in a jar file that is
* visible to the system class loader, and that jar file contains a
* provider-configuration file named
*
* <tt>java.nio.channels.spi.SelectorProvider</tt> in the resource
* directory <tt>META-INF/services</tt>, then the first class name
* specified in that file is taken. The class is loaded and
* instantiated; if this process fails then an unspecified error is
* thrown. </p></li>
* 如果一个提供者是被安装在一个jar文件当中,并且他对于System的类加载器可见,这个jar文件包含的provider-configuration文件要被命名为java.nio.channels.spi.SelectorProvider
* 并且存放在META-INF/services目录下面,在这个文件中的第一个指定的类名。这个类会被加载和安装,错误则抛出异常
* <li><p> Finally, if no provider has been specified by any of the above
* means then the system-default provider class is instantiated and the
* result is returned. </p></li>
* 最后,如果上面中没有任何一个去指定了provider,系统默认的provider类将会被安装,这个结果也作为返回值
* </ol>
*
* <p> Subsequent invocations of this method return the provider that was
* returned by the first invocation. </p>
* 对这个方法的后续调用都会返回第一次调用生成的provider
* @return The system-wide default selector provider
*/
public static SelectorProvider provider() {
synchronized (lock) {
if (provider != null)
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;
}
});
}
}
..................................................
..................................................
..................................................
}
Netty的SelectorProvider
最新推荐文章于 2022-04-25 15:16:34 发布