Java NIO Selector

2025年3月21日 | 阅读 4 分钟

在 Java NIO 中,Selector 是可选择通道的复用器,它是一种可以置于非阻塞模式的特殊类型的通道。它可以检查一个或多个 NIO 通道,并确定哪些通道已准备好进行通信,即读取或写入。


Selector 的作用是什么

Selector 用于使用单个线程处理多个通道。因此,它需要更少的线程来处理通道。线程之间的切换对操作系统来说代价很高。因此,为了提高系统效率,使用了它。

让我们看看一个使用 Selector 处理 3 个通道的线程的示意图

让我们看看 Gather 原理的简单示意图

Java Nio tutorial13

创建 Selector

我们可以通过调用 Selector.open() 方法来创建一个 Selector,如下所示


打开服务器套接字通道

让我们看看打开服务器套接字通道的示例


使用 Selector 选择通道

在注册了一个或多个通道到 Selector 后,我们可以调用 select() 方法之一。此方法返回一个已准备好执行我们想要执行的事件(即连接、读取、写入或接受)的通道。

用于选择通道的各种 select() 方法是

  • int select(): select() 方法返回的整数值会告知有多少个通道已准备好进行通信。
  • int select(long TS): 此方法与 select() 相同,只是它会将输出阻塞最长 TS(以毫秒为单位)的时间段。
  • int selectNow(): 它不会阻塞输出,并立即返回任何已准备好的通道。

selectedKeys()

一旦我们调用了任何一个 select() 方法,它就会返回一个值,表明一个或多个通道已准备就绪,然后我们可以通过调用 Selector 的 selectedKeys() 方法来访问已准备好的通道,如下所示。

我们可以迭代 selected key set 来访问已准备好的通道,如下所示

上面的循环迭代 selected key set 中的一个 key,以确定使用已选定的通道执行的操作。

完整的 select 循环框图如下所示

Java Nio tutorial14

基本 Selector 示例

主程序

客户端程序

输出

主程序输出为

客户端程序输出为