明白了,时隔多年又踩了一次巨坑,注册 OP_READ 事件和轮询事件必须是同一个线程才不会错乱,我注册事件的线程是应用线程,轮询是客户端调度线程。几年前我在实现多个全局调度器轮流接收新连接时,注册和轮询 ACCEPT 事件也是两个不同线程,也排查了好久,我都把踩坑的注释删了,又踩一次。[摊手]

@zhh-4096

java nio 有个诡异的行为,如果先通过AbstractSelectableChannel.configureBlocking(boolean) 配置成阻塞模式,连接成功后,再配置成非阻塞模式,并注册 SelectionKey.OP_READ,即便后端有发回数据,客户端有时能触发 read 事件,有时又不能。如果先配置成非阻塞模式,之后转成阻塞再转非阻塞都正常。 ​​​

Reply to this note

Please Login to reply.

Discussion

No replies yet.