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<Runnable> taskQueue;
private volatile Thread thread;
- 所有由eventloop所处理的各种io事件都在它所关联的thread上执行
- 一个 Channel在他的生命周期中只会注册在一个eventloop上
- 一个EventLoop在运行过程中,会被分配给多个Channel