《Java 源码分析》:Java NIO 之 Selector(第一部分Selector.open())

本文详细分析了Java NIO中的Selector.open()方法,探讨了SelectorProvider如何创建WindowsSelectorProvider对象,以及通过WindowsSelectorProvider实例化WindowsSelectorImpl的过程。同时,介绍了Pipe.open()方法在Windows环境下的实现,涉及到PipeImpl和PollArrayWrapper的使用,揭示了Selector在Windows系统下的工作原理。
摘要由CSDN通过智能技术生成

《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对象实例࿱

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值