gpt4 book ai didi

java - java nio 选择器什么时候在 select() 调用上解锁

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:50 25 4
gpt4 key购买 nike

我正在学习 NIO 包。我引用了 here 中的 NioServer 示例. NioServer.java 中的选择器线程在

上阻塞
this.selector.select(); 
Iterator<SelectionKey> selectedKeys = this.selector.selectedKeys().iterator();
while (selectedKeys.hasNext()) {
SelectionKey key = selectedKeys.next();
selectedKeys.remove();
if (!key.isValid()) {
continue;
}

if (key.isAcceptable()) {
this.accept(key);
} else if (key.isReadable()) {
this.read(key);
} else if (key.isWritable()) {
this.write(key);
}

当远程客户端连接时,this.accept(key) 被调用并且在这个方法中感兴趣interestOps 更改为 Read 并唤醒选择器。这是导致选择器选择该 channel 的原因吗?所以我们以这种方式发出信号以选择 channel ?

现在假设写入一个套接字 channel 选择器是通过改变感兴趣的是 channel 已准备好写入。但是假设由于套接字缓冲区已满而导致写入未完成,如代码所示,那么我们不会改变兴趣并将其保持为只写状态。那么选择器什么时候会选择这个 channel 呢?

最佳答案

  1. this.accept(key) 调用 serverSocketChannel.accept() 返回一个套接字 channel 用于与客户端通信.为“读取”操作向选择器注册的是这个 channel ,即选择器现在有两个注册:

    • 原始的 ServerSocketChannel,带有 OP_ACCEPT
    • 新客户端的 SocketChannel,带有 OP_READ
  2. 如果由于缓冲区已满而无法完成写入,则相应的 SocketChannel 将保持向 OP_WRITE 注册。一旦客户端从另一端读取一些数据, channel 将再次被选择,允许我们在将兴趣集翻转回 OP_READ 之前写入剩余的数据。

关于java - java nio 选择器什么时候在 select() 调用上解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com