Reactor模式是把一个完整的IO操作分成几部分来进行,使用一个或多个Reactor来处理IO请求,对于具体的IO读写以及数据读取完成后的操作,分成更细粒度的模块,根据具体的需求和模块的耗时,来选择性使用单线程或是多线程或者线程池来完成整个IO操作。
来看具体的例子:
注册accpet事件;
设置通道为非阻塞。
这里的key.attachment()第一次是在Reactor初始化时设置的:
接下来来看Acceptor:
设置非阻塞模式;
注册读事件;
attach具体的处理handler。
selector.wakeup()针对多线程,唤醒selector.select()方法上阻塞的线程。
这里sk.attach(new Handler(sk, sc));后,会返回到Reactor的while(true)主循环里dispatch()方法进行处理:
最后来看具体的处理Handler:
添加一个state变量,用来区分 读/写 操作。