select()方法是个阻塞方法,有通道就绪才会返回。
select(long timeout),最多阻塞timeout毫秒,即使没有通道就绪也会返回,若超时返回,则当前线程中断标志位被设置。若阻塞时间内有通道就绪,就提前返回。
seletor.selectNow(),非阻塞方法。
一个seletor对象内部维护了三个集合。
1)已注册集合:表示了所有已注册通道的SelectionKey对象。
2)就绪集合:表示了所有已就绪通道的SelectionKey对象。
3)取消集合:表示了所有需要取消注册关系的通道的SelectionKey对象。
SelectionKey的cancel方法用于取消通道和选择器的注册关系,这个方法只是把表示当前通道的SelectionKey放入取消集合中,下次调用select方法时才会真正取消注册关系。
select方法每次会从已注册的通道集合中删除所有已取消的通道的SelectionKey,然后清空已取消的通道集合,最后从更新过的已注册通道集合中选出就绪的通道,放入已就绪的集合中。每次调用select方法,会向已就绪的集合中放入已就绪通道的SelectionKey对象,调用selectedKeys 方法就会返回这个已就绪通道集合的引用。当我们处理完一个已就绪通道,该通道对应的SelectionKey对象仍然位于已就绪的集合中,这就要求我们处理一个已就绪的通道后就必须手动从已就绪的集合中删除它,否则下次调用selectedKeys时,已处理过的通道还存在于这个集合中,导致线程空转。这里也是极易产生bug的。
from:http://www.cnblogs.com/nullzx/
注:文章乃参考、转载其他博客所得,仅供自己学习作笔记使用!!!