Java NIO Selector、SelectableChannel和SelectorProvider

阅读数:56 评论数: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。

 




相关推荐

一、Socket通道 分部socket通道类(DatagramChannel、SocketChannel和ServerSocketChannel)在被实例化时都会创建一个对等的socket对象(Dat

1、基本类型 在程序设计中经常用到一系列类型(基本类型),它们需要特殊对待。对于这些类型,Java采取与C和C++相同的方法,也就是说,不用new来创建变量,于是创建一个并非引

1、直接常量 为了编译器可以准确的知道要生成什么样的类型,可以给直接常量后面添加后缀字符标志它的类型,若为L表示long,F表示float,D表示double。也可以利用前缀表示进制,0x表示十六进制

Java完全采用动态内存分配方式。每当想创建新对象时,就需要使用new关键字来构建此对象实例。 1、this 在构造器中,如果为this添加了参数列表,那么就有了

一、类的继承 1、说明 (1)extends关键字用于类的继承。 (2)在C++中,方法的动态绑定是使用virtual关键字来实现的,而在Java中,动态绑定是默认的形为,不需要添加额外的关键字。 (

1、类型信息 指程序能够在运行时发现和使用类型信息,我们一般使用两种方式来实现运行时对象和类的信息:传统的RTTI和反射机制。 (1)class对象 <p

用于描述Java源代码,使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。使用时在@后面跟注解的名字。 1、预定义的三个注解<

一、创建线程 创建线程有四种方式:继承Thread类、实现Runnable接口、实现Callable接口、通过线程池创建。 1、继承Thread 重写run方法。 class A extends Th

一、Collection接口 Collection接口的iterator和toArray方法都用于获得集合中的“所有元素”。前者返回一个“iterator”对象,后者返回一个包含集合中所有元素的数组。

1.hashCode的存在主要用于查找的快捷性,如hashtable,hastmap等,hashcode是用来在散列存储结构中确定对象的存储地址的。 2.如果两个对象相同,就是适用