账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java的NIO是同步非阻塞,但为什么其核心的Selector.select()是阻塞的?
    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()方法时,它会阻塞直到以下三种情况之一发生:

      1. 已注册的至少一个通道上有新的I/O操作已经就绪(如可读、可写等)。
      2. 当前线程被中断。
      3. 设置了Selector的超时时间到达。

      虽然这个方法在没有准备好的channel时会阻塞,但一旦有至少一个通道准备好进行I/O操作或满足上述任一条件,它就会立即返回并继续执行,从而允许程序在非阻塞模式下处理这些事件,这也是其“非阻塞”特性体现的地方。

      因此,我们说Selector是同步非阻塞I/O的重要组成部分,它的select()方法提供了一种机制来检查多个通道的状态,并且只有在有至少一个通道准备好时才会从阻塞状态恢复,这样可以避免无谓的CPU空转,提高系统资源利用率。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部