• 传统的服务器设计,通常是这样接收请求的:
    • 每一个请求会创建一个线程,用该线程执行handler
    • 缺陷是IO阻塞会耗费大量资源
  • 基础的Reactor模式
    • Reactor负责将io事件分发给handler
    • Handler负责执行非阻塞任务(handler可以类比为按钮的ActionListener)
  • nio的一些概念:
    • 一个channel对应一个连接。类似于outputstream和inputstream的合集。
    • Selector可以管理多个channel,并能够知晓通道是否为诸如读写事件做好准备。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接
    • SelectionKey对应一个io事件,包含了状态和相关的channel,selector等对象
    • 示例:一个Selector的打开和持续监听事件(这个可以粗略的认为是Reactor模式在nio的实现,每个client可以看做一个channel,Reactor可以看做一个while循环里面不断selector.select()取出selectionKey然后处理,整个流程是单线程的处理了多个连接)
  • 上述的模式(上面的代码)缺点是handle部分可能会占用过长时间从而使reactor变慢,因此可以改进为多线程处理业务逻辑:
  • 考虑到多核cpu,可以再改进为多reactor的模式:
    • mainReactor主要是监听客户请求:serverSocket.accept(),拿到channel再交给subReactor
    • 一个subReactor就是一个Selector(多个subReactor就是Selector数组了)
  • 具体代码,可以直接百度本笔记的标题。