Java的NIO是同步非阻塞,但为什么其核心的Selector.select()是阻塞的?

Java的NIO是同步非阻塞,但为什么其核心的Selector.select()是阻塞的?不矛盾吗?

Selector selector = Selector.open();
while (true) {
    int nReady = selector.select(); // 这里会阻塞,哪里体现非阻塞?
    Set<SelectionKey> keys = selector.selectedKeys();
    Iterator<SelectionKey> it = keys.iterator();
    //...
}
阅读 7.6k
2 个回答

NIO 是同步非阻塞 这句话指的是对于一个IO来看,是同步非阻塞,非阻塞的意思是拥有这次IO的线程没有阻塞,而在NIO中实际上是一条线程拥有很多的IO,有任何一个IO有数据 ,selector就被唤醒,所以你可以这么想:在这条线程中,当IOA没有数据处于等待时,IOB可能正在被处理,所以这条线程并没有被这个IOA阻塞,
感觉你太纠结于阻塞非阻塞了,不用这么纠结在这方面。
还有NIO我觉得严格意义上来说应该是多路复用,而不是同步非阻塞

不要把select和io本身搞混了,select是一个大管家,一次select可以同时检查多个io读写,每个io都是非阻塞的。

另外,别忘了还有selectNow,这个连select这个大管家也是非阻塞的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题