select在一些什么情况下会返回0,一些什么情况下会阻塞

来源:7-10 NIO服务器Thread优化-4

PerryMore

2020-12-27

以下图片中的注释是发送一条消息时,被打印出来的日志。
图片描述

网上很多资料说,当selectionKeys的size为0时,会导致select()方法阻塞,但上面的注释好像推翻了这一点。

为什么“ddd”消息发送后,readSelector.select()方法没有阻塞住,而且返回为0。

所以select方法何时返回0,何时被阻塞?

写回答

1回答

Qiujuer

2020-12-28

select() 不管是否有key都会被阻塞,至于返回0,有几种常见情况:

  1. 线程意外中断返回时,此时可能无就绪任务所以为0

  2. 当有新的事件需要注册时,需要对selector进行唤醒操作,唤醒操作会导致强制返回,此时若无就绪任务则也是0

  3. select可以指定超时时间,超时时也会返回,若无就绪任务也是0


所以其根本在于是否有就绪的任务。


0
2
Qiujuer
回复
PerryMore
调用select(),并且没有任何注册的事件就绪的时候。就会持续阻塞等待。
2021-01-05
共2条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程