@
gramyang decode 和 codec 就不说了.
两种方法个人感觉是不会有太大影响的.
Netty 的 BossGroup 和 WorkerGroup 主要用来保证系统的 IO 性能,就是所谓的 IO 线程池,只要不直接在这两个线程池里面进行耗时的操作,应该不会影响 netty 的 io 性能.
netty 启动的时候,配置了一个 BossGroup 和 WorkerGroup,伪代码如下:
```java
// 设置 NIO
serverBootstrap.channel(NioServerSocketChannel.class);
// 设置多线程模型
serverBootstrap.group(nettyConfig.getBossGroup(), nettyConfig.getWorkerGroup());
// 设置 handler 集合
serverBootstrap.childHandler(initializerFactory);
```
在增加 ctx 的时候,增加了业务线程池,如下:
```java
protected void initChannel(Channel arg0){
arg0.pipeline()
// 业务处理控制器
.addLast(businessGroup,new BusinessHandler());
}
按照你给的简书的那部分说明,找到对应源码:
```java
static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) {
final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next);
EventExecutor executor = next.executor();
if (executor.inEventLoop()) {
next.invokeChannelRead(m);
} else {
executor.execute(new Runnable() {
public void run() {
next.invokeChannelRead(m);
}
});
}
}
```
`if (executor.inEventLoop()) {`这个分支在 addLast 时,增加了业务线程池以后,是会走下面的 else 的.
所以,我个人觉得,写在 handler 和 ctx 的线程池,实际上都是脱离了 netty 的核心 io 线程池的.并不会影响 netty 的 io 和并发吞吐量.
至于性能上的影响,在硬件配置相同的情况下.
写在 ctx 和写在 handler 的线程池的性能差别,主要看你在 handler 交给线程池前,做了什么耗时的操作没有.否则效果应该没差别.
PS:
回复不知道支持不支持 md 语法...