NIO的Channel可被多路复用的能力
Selector根据Channel的状态来分配任务,所以Channel使用register(Selector,int,Object)方法将自己和相应的状态注册到Selector中。register方法会返回一个SelectionKey来代表这Channel在Selector上的状态。事实上最终是将SelectionKey注册到Selector上。
1、注册使用Channel的register(Selector,int,Object),并返回注册成功的SelectionKey。
1)、首先对Channel的状态和注册的参数进行验证(是否是阻塞模式)。
2)、查看Channel的keys中是否Channel注册过这Selector。如果已经注册过则更新SelectionKey的状态。如果没有则使用Selector.register(Channel,int,Object)方法,先生成新的SelectionKey,然后将已经取消注册的cancelledKeys从Selector的keys中移除,最后将SelectionKey添加到Selector和Channel中,并返回。
2、取消注册可以使用Channel.close()或者Selector.cancel(SelectionKey k)或SelectionKey.cancel()。
1)、Channel.close()会对Channel注册的所有SelectionKey取消注册(Channel中keys的作用)。调用:SelectionKey.cancel()->Selector.cancel(SelectionKey k)
2)、SelectionKey.cancel()事实上调用的是Selector.cancel(SelectionKey k)。
3)、Selector.cancel(SelectionKey k)将取消的SelectionKey 添加到cancelledKeys中。
抽象类AbstractSelectableChannel
public abstract class AbstractSelectableChannel
extends SelectableChannel
{
方法
1、注册使用register方法
public final SelectionKey register(Selector sel, int ops,
Object att)
throws ClosedChannelException
{
synchronized (regLock) {
if (!isOpen())//1、判断Channel是否开启