Java NIO Selector、SelectableChannel和SelectorProvider
阅读数:88 评论数:0
跳转到新版页面分类
python/Java
正文
Selector
Selector是一个多路复用器,它负责管理被注册到其上的SelectableChannel。
1、目前多路复用IO实现主要:
(1)select
它仅仅知道,有IO事件发生了,却并不知道哪几个流(可能有一个或多个),我们只能无差别轮询所有流,找出能读出数据或写入数据的流,对他进行操作,所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
(2)poll
poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。
(3)epoll
epoll可以理解为event poll,epoll会把哪个流发生了怎么样的IO事件通知我们,所以epoll是事件驱动的。
默认JDK提供了对POLL、KQUEUE这两个多路复用IO的实现,对于其他实现则转交代理类SelectorProvider来提供,而SelectorProvider根据不同操作系统的内核不同而不同。
2、Selector的创建、关闭
(1)Selector.open()
会调用操作系统底层的Selector实现创建Selector。
(2)SelectorProvider.openSelector()
(3)Selector.close() 关闭
SelectableChannel
SelectableChannel是连接到操作系统的连接通道,用于应用程序和操作系统交互、传递数据。它是双向的,可以读取数据,也可以写数据。
SelectorProvider
JDK里对Selector的实现都交由SelectorProvider的方法provider()来提供。
SelectorProvider的创建分三步进行:
(1)由JDK的参数-Djava.nio.channels.spi.SelectorProvider=class设置的class来反射构造SelectorProvider, 找不到就跳转到步骤(2)。
(2)从jar中的目录META/services配置文件 中找参数java.nio.channels.spi.SelectorProvider=class设置的第一个class来反射构造SelectorProvider,找不到就跳转到步骤(3)。
(3)调用不同操作系统版本的JDK里自带的sun.nio.ch.DefaultSelectorProvider来创建SelectorProvider。