反应堆模式是一种对象行为类的设计模式,对同步事件分拣和派发。它是处理并发I/O比较常见的一种模式,用于同步I/O。html
其中心思想是将全部要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或者是准备就绪,多路复用器返回并将相应的I/O事件分发到对应的处理器中。react
Reactor是一种事件驱动机制,和普通函数的不一样之处在于:应用程序不是主动的调用某个API完成处理,Reactor逆置了事件处理流程,应用程序须要提供相应的接口并注册到Reactor上,若是相应的时间发生,Reactor将主动调用应用程序注册的接口(这些接口又被称为"回调函数")。下面是事件驱动机制的模型图:设计模式
事件驱动(回调)就是应用业务向一个中间人注册一个回调(event handler),当I/O就绪后,就向这个中间人产生一个事件,并通知此handler进行处理。这个中间人是由一个不断等待和循环的单独线程来承担,它接受全部的handler的注册,并负责向操做系统查询IO是否就绪在就绪后就调用指定的handler进行处理。这个中间人的名字就就叫作Reactor。数组
Reactor模式是编写高性能网络服务器的必备技术,主要有如下优势:服务器
Handler表明操做系统管理的资源,包括:网络链接、打开的文件、同步对象等等。事件能够来自外部,如客户端的链接请求、数据等,也能够来自内部,如定时器事件。网络
由操做系统提供的I/O多路复用机制,例如select和epoll,程序首先将其关心的句柄(即事件源)及其事件注册到event demultiplexer上,当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集中,一个或者多个句柄的事件已经就绪”;程序收到通知后,就能够在非阻塞的状况下对事件进行处理了。多线程
一个或多个模板函数组成的接口,描述了和应用程序相关的对某个事件的操做并发
事件处理接口的实现,实现了应用程序提供的某个服务函数
定义了一些接口,用于应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关的描述符,是事件处理器的调度核心。Reactor管理器使用同步事件分离器来等待事件的发生。一旦事件发生,Reactor管理器先是分离每一个事件,而后调度事件处理器,最后调用相关的模 板函数来处理这个事件。性能
NIO中Reactor的核心是Selector。下面是一个简单的示例:
public class Reactor implements Runnable { Selector selector; public Reactor() throws IOException { selector = Selector.open(); } public void run() { try { while (!Thread.interrupted()) { // 循环,等待事件 selector.select(); Set selected = selector.selectedKeys(); Iterator it = selected.iterator(); while (it.hasNext()) // 调用handler,处理事件 dispatch((SelectionKey) (it.next())); selected.clear(); } } catch (IOException ex) { /* ... */ } } void dispatch(SelectionKey k) { Runnable r = (Runnable) (k.attachment()); if (r != null) r.run(); } }