netty的线程安全以及eventloop+channel关系

netty中channel是线程安全的。因此,我们可以存储一个channel的引用,并且在需要向远端发送数据时,通过这个引用来调用channel相关的方法。即便此时有多个线程都在使用它,也不会出现多线程问题。而且,消息一定会按照顺序发送出去。

  • 一个EventLoopGroup 只会包含一个或多个EventLoop
  • 一个EventLoop在它的整个生命周期中都只会与唯一一个Thread绑定,下面是它的父类中的对象
/**
 * Abstract base class for {@link OrderedEventExecutor}'s that execute all its submitted tasks in a single thread.
 *
 */
public abstract class SingleThreadEventExecutor extends AbstractScheduledEventExecutor implements OrderedEventExecutor {

    static final int DEFAULT_MAX_PENDING_EXECUTOR_TASKS = Math.max(16,
  //省略不相关代码
    private final Queue taskQueue;

    private volatile Thread thread;

  • 所有由eventloop所处理的各种io事件都在它所关联的thread上执行
  • 一个 Channel在他的生命周期中只会注册在一个eventloop上
  • 一个EventLoop在运行过程中,会被分配给多个Channel

你可能感兴趣的:(netty的线程安全以及eventloop+channel关系)