小弟近日研究java的nio,有几个比较疑惑的地方,发出来请众位高手解惑
1. selector机制:经过查看各种网上资料及java nio这本书,得知,当调用selector.select()方法时,调用底层的selectorimpl的doSelect()方法(windows是WindowsSelectorImpl,linux2.6及以上是EPollSelectorImpl),在这里,仅以linux系统为例,doSelect方法调用epoll的epollWait, 等待io事件的发生(连接、读、写等),当有感兴趣的事件发生后,epollWait会返回事件就绪的通知,这段时间doSelect方法是阻塞的,直到epollWait返回, 那么,epollWait返回之后,selector又做了哪些事呢?该怎么定位epoll返回的那个事件就绪的通道? 是忙轮询?
2. SelectableChannel的非阻塞原理:我们都知道可以为可选择通道设置为非阻塞模式,那么这个设置到底是在什么时候发挥作用的呢?是在selector忙轮询channel是否有IO事件就绪时吗?还是其他什么地方?
3. isWritable事件何时触发:accpet, read事件的触发很好理解,当客户端发起连接和往服务端发送数据时,会触发accept和read, 那么write事件是何时触发的呢,还是说如果没有read事件,write事件是随时触发的?(我在调试的时候,总是会进入到 if(key.isWritable()) 的语句块里,我怀疑是不是当前通道是不是一直都是可写状态的)