Selector提供选择执行已经就绪的任务的能力,使得多元 I/O 成为可能,就绪选择和多元执行使得单线程能够有效率地同时管理多个 I/O channel。
C/C++许多年前就已经有 select()和 poll()这两个POSIX(可移植性操作系统接口)系统调用可供使用。许多os也提供相似的功能,但对Java 程序员来说,就绪选择功能直到 JDK 1.4 才成为可行方案。
简介
获取到SocketChannel后,直接包装成一个任务,提交给线程池。
引入Selector后, 需要将之前创建的一或多个可选择的Channel注册到Selector对象,一个键(SelectionKey)将会被返回。
SelectionKey 会记住你关心的Channel,也会追踪对应的Channel是否已就绪。
每个Channel在注册到Selector时,都有一个感兴趣的操作。
ServerSocketChannel 只会在选择器上注册一个,其感兴趣的操作只有ACCEPT,表示其只关心客户端的连接请求
SocketChannel,通常会注册多个,因为一个server通常会接受到多个client的请求,就有对应数量的SocketChannel。SocketChannel感兴趣的操作是CONNECT、READ、WRITE,因为其要与server建立连接,也需要进行读、写数据。
1 Selector
1.1 API
open
打开一个 selector
新的selector是通过调用系统默认的SelectorProvider对象的openSelector方法而创建的。
注意到默认选择器提供者
Mac下的JDK,所以我们需要下载对应平台下的 JDK 哦!
Selector.open()
不是单例模式的,每次调用该静态方法,会返回新的Selector实例。