1.基于select的NIO
(jdk1.4版本)
socketChannel被while(true)轮训处理,socketChannel可能没有读写时间发生,但每次都会便利处理所有socketChannel,存在大量空循环,耗费性能。
2.基于selector(epoll)的NIO
selector最底层其实是依靠操作系统用c语言实现的epoll。
socketChannel被注册到selector(epoll内部维护了两个集合,一个集合用来存放socketChannel,和一个集合用来存放就绪事件列表)中,监听连接、读、写等事件。
然后循环调用selector.select()方法,该方法是一个阻塞方法,底层就是调用到epoll的监听方法,真正执行监听,只有selector监听到连接、读、写事件,也就是就绪事件集合不为空时,才会继续往下执行。
然后循环处理发生了有效事件的socketChannel,也就是处理就绪事件集合,完成业务逻辑。
网友评论