为什么事件循环使用多个线程?

时间:2019-01-10 16:30:52

标签: java netty

我一直认为异步是关于有效的资源利用和线程安全,但是今天我遇到了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是多线程的,那又有什么意义呢?

1 个答案:

答案 0 :(得分:3)

perl -pe uc /etc/passwd 使用辅助线程来利用多个CPU内核。根据{{​​3}}:

  

NioEventLoopGroup()

     

使用默认线程数,默认ThreadFactory和SelectorProvider.provider()返回的SelectorProvider创建一个新实例。

根据the no-argument constructor javadoc的默认线程计数将是可用处理器数量的两倍:

NioEventLoopGroup

通常,这应该足以使CPU饱和而不创建大量线程。生成的线程太少,您将无法获得完整的CPU使用率。生成太多,您将浪费大量时间在它们之间进行上下文切换。