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异常。