5.6.4 Selector小结
总的来说,使用Selector的步骤如下:
Ⅰ.创建一个Selector实例。
Ⅱ.将其注册到各种信道,指定每个信道上感兴趣的I/O操作。
Ⅲ.重复执行:
1.调用一种select方法。
2.获取选取的键列表。
3.对于已选键集中的每个键。
a.获取信道,并从键中获取附件(如果合适的话)
b.确定准备就绪的操作并执行。如果是accept操作,将接受的信道设置为非阻塞模式,并将其与选择器注册。
c.如果需要,修改键的兴趣操作集
d.从已选键集中移除键
如果选择器告诉了你什么时候I/O操作准备就绪,你还需要非阻塞I/O吗?答案是肯定的。信道在已选键集中的键并不能确保非阻塞I/O,因为调用了select()方法后,键集信息可能会过时。另外,阻塞式写操作会阻塞等待直到写完所有字节,而就绪集中的OP_WRITE仅表示至少有一个字节可写。实际上,只有非阻塞模式的信道才能与选择器进行注册:如果信道在阻塞模式,SelectableChannel类的register()方法将抛出IllegalBlockingModeException异常。