我一直认为异步是关于有效的资源利用和线程安全,但是今天我遇到了Natty的奇怪行为。
public class Example {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
try {
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel channel) {
channel.pipeline()
.addLast(new ChannelOutboundHandlerAdapter() {
@Override
public void read(ChannelHandlerContext ctx) {
String id = String.valueOf(Thread.currentThread().getId());
ctx.writeAndFlush(Unpooled.wrappedBuffer(id.getBytes(StandardCharsets.UTF_8)))
.addListener(ChannelFutureListener.CLOSE);
}
});
}
})
.bind("localhost", 1234)
.sync()
.channel()
.closeFuture()
.syncUninterruptibly();
} finally {
group.shutdownGracefully()
.syncUninterruptibly();
}
}
}
当我第一次连接时,我得到16。超过17、18、19等。每个连接都在新线程上执行!为什么?如果Netty是多线程的,那又有什么意义呢?
答案 0 :(得分:3)
perl -pe uc /etc/passwd
使用辅助线程来利用多个CPU内核。根据{{3}}:
NioEventLoopGroup()
使用默认线程数,默认ThreadFactory和SelectorProvider.provider()返回的SelectorProvider创建一个新实例。
根据the no-argument constructor javadoc的默认线程计数将是可用处理器数量的两倍:
NioEventLoopGroup
通常,这应该足以使CPU饱和而不创建大量线程。生成的线程太少,您将无法获得完整的CPU使用率。生成太多,您将浪费大量时间在它们之间进行上下文切换。