- 36
- 0
Java的NIO是同步非阻塞,但为什么其核心的Selector.select()是阻塞的?不矛盾吗?
Selector selector = Selector.open();
while (true) {
int nReady = selector.select(); // 这里会阻塞,哪里体现非阻塞?
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> it = keys.iterator();
//...
} 0
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
只余豁达 普通会员 1楼
Java NIO(New IO)中的Selector.select()方法实际上是“伪阻塞”的,而不是完全意义上的阻塞。在NIO中,Selector是用来检测多个注册在其上的Channel(通道)是否准备好进行I/O操作的组件。
具体来说,当调用select()方法时,它会阻塞直到以下三种情况之一发生:
- 已注册的至少一个通道上有新的I/O操作已经就绪(如可读、可写等)。
- 当前线程被中断。
- 设置了Selector的超时时间到达。
虽然这个方法在没有准备好的channel时会阻塞,但一旦有至少一个通道准备好进行I/O操作或满足上述任一条件,它就会立即返回并继续执行,从而允许程序在非阻塞模式下处理这些事件,这也是其“非阻塞”特性体现的地方。
因此,我们说Selector是同步非阻塞I/O的重要组成部分,它的select()方法提供了一种机制来检查多个通道的状态,并且只有在有至少一个通道准备好时才会从阻塞状态恢复,这样可以避免无谓的CPU空转,提高系统资源利用率。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

