- 一个EventLoopGroup当中包含多个EventLoop.
- 一个EventLoop在它的生命周期当中只有唯一一个Thread进行绑定。
- 启用EventLoop所处理的各种I/O事件都将在它所关联的那个Thread上进行处理。
- 一个Channel在它的生命周期当中只会注册在一个EventLoop上。
- 一个EventLoop在运行过程中,会被分配给一个或多个channel.
在Netty中,Channel的使用一定是线程安全的,基于此我们可以存储一个channel的引用,并且需要要向远程端点发送数据时,通过这个引用来调用channel相应的方法,即便当时有很多线程在使用也不会出现多线程问题;而且,消息一定会按顺序发送出去
我们在业务开发中,不要将长时间的耗时任务放在EventLoop的执行队列,因为它会将一直阻塞该线程池所对应的有channel上的其他执行任务,如果我们需要进行阻塞或者耗时的操作,那么就需用使用一个专门的EventExecutor。
通常会有两种使用方式:
- 在channelHandler的回调方法中,使用自己定义的业务线程池,这样就可以实现异步调用。
- 借助Netty提供的ChannelPipline添加的channelHandler时调用的addLast方法传递EventExecutor.
在netty中有两种发消息的方式,第一种是可以直接写到channel中,或者可以写到channelHandler所关联的ChannleHandlerContext中,对于前一种方式,消息会从channelPipline的末尾开始流动,而对于后一种方式,消息会从ChannelPipline的下一个ChannelHandler开始流动。
结论:
-
ChannelHandlerContext与ChannelHandler之间的绑定关系是永远不会改变的,因此对其缓存是没有任何问题的。
-
对于与Channel同名方法来说,ChannelHandlerContext的方法会产生更短的事件流,我们可以提升性能。