Java NIO 选择器(Selector)讲解和实战demo

Java NIO 的选择器(Selector)是一个可选择的通道对象。它可以用于监控多个通道的状态,并确定哪个通道准备好进行读取或写入。

以下是 Java NIO 的选择器的一些关键点:

选择器可以同时监视多个通道,只使用单个线程就可以监视多个通道。
选择器通过使用 Selector.open() 方法创建。
通道必须注册到选择器上才能被监视。当一个通道注册到选择器上时,会返回一个选择键(SelectionKey)对象,该对象包含了通道与选择器之间的关系信息。
选择器在调用 select() 方法时会阻塞,直到有一个或多个通道就绪才会返回,通道就绪意味着它们已经可以进行读取或写入操作。
一旦选择器返回,可以通过调用 selectedKeys() 方法来获取表示就绪通道的 SelectionKey 对象的集合。
可以通过 SelectionKey 对象的 readySet() 方法来确定哪个 I/O 操作就绪。

以下是一个 Java NIO 选择器的示例代码:

// 创建选择器
Selector selector = Selector.open();

// 将通道注册到选择器上,并指定监听读取事件
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);

// 阻塞并等待就绪通道
int readyChannels = selector.select();

// 获取表示就绪通道的 SelectionKey 对象集合
Set<SelectionKey> selectedKeys = selector.selectedKeys();

// 遍历就绪通道集合,并处理就绪通道
for (SelectionKey key : selectedKeys) {
    if (key.isReadable()) {
        // 读取数据
        // ...
    } else if (key.isWritable()) {
        // 写入数据
        // ...
    }
}

在上面的示例中,首先通过 Selector.open() 方法创建了一个选择器,然后将一个通道注册到选择器上并指定了监听读取事件。接着在调用 select() 方法时,选择器会阻塞并等待就绪通道。当有通道就绪时,可以通过 selectedKeys() 方法获取表示就绪通道的 SelectionKey 对象集合,并遍历这个集合来处理就绪通道。在处理就绪通道时,可以通过 SelectionKey 对象的 isReadable() 和 isWritable() 方法来确定哪个 I/O 操作就绪,然后进行相应的操作。