7 EventLoop 和 线程模型
这一章需要JUC相关的知识。
事件/任务的执行顺序 事件和任务是以先进先出(FIFO)的顺序执行的。这样可以通过保证字
节内容总是按正确的顺序被处理,消除潜在的数据损坏的可能性。
我们之前已经阐明了不要阻塞当前I/O 线程的重要性。我们再以另一种方式重申一次:“永
远不要将一个长时间运行的任务放入到执行队列中,因为它将阻塞需要在同一线程上执行的任何
其他任务。”如果必须要进行阻塞调用或者执行长时间运行的任务,我们建议使用一个专门的
EventExecutor。(见6.2.1 节的“ChannelHandler 的执行和阻塞”)。
EventLoopGroup 负责为每个新创建的Channel 分配一个EventLoop。在当前实现中, 使用顺序循环(round-robin)的方式进行分配以获取一个均衡的分布,并且相同的EventLoop 可能会被分配给多个Channel。(这一点在将来的版本中可能会改变。) 一旦一个Channel 被分配给一个EventLoop,它将在它的整个生命周期中都使用这个 EventLoop(以及相关联的Thread)。请牢记这一点,因为它可以使你从担忧你的Channel- Handler 实现中的线程安全和同步问题中解脱出来。 另外,需要注意的是,EventLoop 的分配方式对ThreadLocal 的使用的影响。因为一个 EventLoop 通常会被用于支撑多个Channel,所以对于所有相关联的Channel 来说, ThreadLocal 都将是一样的。这使得它对于实现状态追踪等功能来说是个糟糕的选择。然而, 在一些无状态的上下文中,它仍然可以被用于在多个Channel 之间共享一些重度的或者代价昂 贵的对象,甚至是事件。