一、Selector注册事件
1.1
SelectionKey.OP_CONNECT
连接就绪(客户端连接好了,需要经过三次握手、四次挥手)
1.2
SelectionKey.OP_ACCEPT
接受就绪(有新客户端来了)
1.3
SelectionKey.OP_READ
就读绪(有新数据到达)
1.4
SelectionKey.OP_WRITE
写就绪(可以写数据了)
二、Selector使用流程
2.1
open()
开启一个选择器,可以给选择器注册需要关注的事件
2.2
register()
将一个Channel注册到选择器,当选择器触发对应关注事件时回调到Channel中,处理相关数据
2.3
select()/selectNow()
一个通道Channel,处理一个当前的可用、待处理的通道数据
(这两个方法是阻塞方法,阻塞直到事件到达。Selector并不是一个完整的观察者模式,是一个半观察者模式。可用向Selector注册和反注册事件,但是事件到达的时候并不会通知Channel,需要遍历池子,在遍历的时候需要一个最基本的线程,所以至少需要一个线程)
2.4
selectedKeys()
得到当前就绪的通道
2.5
wakeUp()
唤醒一个处于select状态的选择器
2.6
close()
关闭一个选择器,注销所有关注的事件
三、Selector注意事项
注册到选择器的通道必须为非阻塞状态
FileChannel不能用于Selector,因为FileChannel不能切换为非阻塞模式;套接字通道可以
(FileChannel仅仅是一个文件通道,可以使用通道的方式操作文件,也就是说可以使用块状的方式操作文件,可以将一整块数据放到buffer当中,一整块数据放到file。但是不能说当前文件可读的时候请告诉我、当前文件可写的时候请告诉我,文件永远都可读)
Interest集合(同时注册了可读、可写状态)、Ready集合(当前就绪的集合,包括可读集合、可写集合)
Channel通道
Selector选择器
obj附加值