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();
    //...
}
一只名叫tom的猫
浏览 2228回答 2
2回答

芜湖不芜

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

相关分类

Java