面试题答案
一键面试1. 事件监听
- Reactor模式:
- Reactor模式中,应用程序自身负责注册感兴趣的事件到Reactor(反应器)。例如在Java NIO中,通过Selector.select()方法阻塞等待事件发生。它会监听多个事件源(如Socket连接)上的事件,当有事件到达时,Selector会返回这些发生事件的通道集合。
- Proactor模式:
- Proactor模式下,操作系统负责事件监听。应用程序向操作系统注册异步操作(如读、写操作)以及相关的完成回调函数。操作系统在后台处理这些操作,当操作完成时,操作系统会通知应用程序。例如在Windows的IOCP(I/O完成端口)机制中,操作系统管理I/O操作并在完成时通知应用。
2. 事件分发
- Reactor模式:
- Reactor在监听到事件后,将事件分发给对应的Handler(事件处理器)。事件分发基于事件的类型,如读事件、写事件等。Reactor根据事件类型找到预先注册的Handler来处理。例如在Netty框架中,ChannelPipeline中的ChannelHandler会按照顺序处理分发过来的事件。
- Proactor模式:
- Proactor模式是在异步操作完成后,将完成事件(包含操作结果)分发给对应的CompletionHandler(完成处理器)。这里分发的是操作完成事件,而不是像Reactor那样分发I/O就绪事件。例如在Boost.Asio库中,当异步操作完成,Proactor将完成事件分发给注册的CompletionHandler。
3. 事件处理
- Reactor模式:
- Handler在Reactor分发事件后,同步执行事件处理逻辑。也就是说,事件处理是在Reactor线程或其相关的线程池中进行。例如在一个简单的基于Reactor的服务器中,当有读事件发生,Handler会立即从Socket中读取数据并进行处理,处理过程可能会阻塞当前线程。
- Proactor模式:
- CompletionHandler在接收到完成事件后,异步执行事件处理逻辑。由于操作已经由操作系统异步完成,CompletionHandler只需要处理操作结果。例如在使用Proactor模式的文件读取操作完成后,CompletionHandler在接收到完成事件和读取到的数据后,进行后续处理,不会阻塞I/O操作线程。