netty中,Channel的实现一定是线程安全的。基于此,我们可以存储一个Channel的引用,并且在需要向远程端点发送数据时,通过这个引用来调用Channel相应的方法,即便当时有很多线程在使用它也不会出现多线程问题,而且,消息一定会按顺序发送出去。
不要把长时间执行耗时任务放入到EventLoop的执行队列中,因为它将会一直阻塞该线程所对应的所有Channel上的其他执行任务。
如果我们需要进行调用或是耗时的操作,就需要使用一个专门的EventExcutor(业务线程池)
通常有两种实现方式:
- 在ChannelHandler的回调方法中,使用自己定义的业务线程池,这样就可以实现异步调用。
- 在pipeline.addLast时,调用
ChannelPipeline addLast(EventExecutorGroup group, ChannelHandler... handlers);
,让handler上的所有回调方法都由该EventExecutorGroup
执行。