1、介绍
(1)seletor能够检测多个注册的通道上是否有事件发生
即seletor上可以注册通道,seletor可以检测这些注册的通道,并且管理。
seletor就是一直在监听通道,以一定的算法监听。
(2)只有在通道(连接)真正的有读写事件发生的时候,才会进行读写,大大减少了系统开销,并且不必为每一个连接都创建一个线程,也不用去维护每一个线程
2、seletor API
seletor是一个抽象类
(1)open:可以获得或者创建一个seletor实例
(2)select(timeout):是一个重载方法,当有值传入时,就说明图片中的解释
流程:
seletor会一直监听所有的通道,当有通道有时间发生时,就会将对应的selectorKey加入到集合中,像是以下图片中的集合
得到所有的selectorkey以后,seletor就会遍历这个key,然后反向得到channel.
select()——>无惨方法是阻塞的,也就是说,select会一直监听channel,当所有的通道都没有事件发生时,就会阻塞在那里。
select(timeout)——>有参方法,timeout是指最大的阻塞时间
(3)selectNow
是一个不会 阻塞的select方法,是指马上遍历马上返回,不会一直监听
(4)selectKey()
区别于select方法,select方法只会返回当前有事件发生的selectKey
但是此方法会返回所有在selector中注册的channel的selectKey
(5)wakeup()
唤醒selector
3、selectorKey在NIO中的应用
说明:
(1)当客户端连接时,会通过serverSocketChannel得到socketchannel
(2)selector进行监听select方法,返回有事件发生的通道的个数
selectionKey中的静态非变量(final),指明注册的类型
register(Selector sel, int ops)中的ops事件就是上面的四个选项之一
op_read:读事件
op_write:写事件
op_connect:连接建议成功
op_accept:客户端连接事件
(3)将socketChannel注册到selector上,SelectionKey register(Selector sel, int ops),一个selector上可以注册多个socketChannel
(4)注册后返回一个selectorKey,会和该selector关联(以集合的形式)
(5)进一步得到各个selectionKey(有事件发生的channel中获取的)
(6)再通过selectionKey反向获取 SelectableChannel channel();
(7)通过得到的channel,完成业务处理
理解源码
是指将当前的channel注册到哪一个seletor中去。opt值的是哪个事件