Netty组件EventLoop、EventLoopGroup

本文详细介绍了Netty的EventLoop、EventLoopGroup以及NioEventLoopGroup和DefaultEventLoopGroup的区别,通过实例展示了如何创建和使用EventLoopGroup进行事件处理、定时任务和细化分工。代码示例包括事件循环的获取、普通任务和定时任务的提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Netty组件EventLoop、EventLoopGroup

1 EventLoop

事件循环
在这里插入图片描述
EventLoop->EventLoopGroup->EventExecutorGroup->ScheduledExecutorService, Iterable
EventLoop->OrderedEventExecutor->EventExecutor->EventExecutorGroup

2 EventLoopGroup

事件循环组
在这里插入图片描述
NioEventLoopGroup 处理IO事件和普通事件、定时任务
DefaultEventLoopGroup 普通事件、定时任务

new NioEventLoopGroup() 构造方法可以指定线程,默认是电脑核数*2
在这里插入图片描述

3 代码

EventLoopGroup loopGroup = new NioEventLoopGroup(2);

//        System.out.println(NettyRuntime.availableProcessors() * 2);

        //2  获取下个事件对象 因为只有2个线程,
        System.out.println(loopGroup.next());
        System.out.println(loopGroup.next());
        System.out.println(loopGroup.next());
        System.out.println(loopGroup.next());

        //输出结果
//        io.netty.channel.nio.NioEventLoop@783e6358
//        io.netty.channel.nio.NioEventLoop@17550481
//        io.netty.channel.nio.NioEventLoop@783e6358
//        io.netty.channel.nio.NioEventLoop@17550481

        //3 普通任务
        loopGroup.next().submit(()->{
            System.out.println("2");
        });


        //定时任务
        loopGroup.next().scheduleAtFixedRate(()->{
            System.out.println("111");
        },1,1, TimeUnit.SECONDS);

EventLoop分工细化

EventLoopGroup boss = new NioEventLoopGroup();  //只负责accept事件 不需要设置成1 new NioEventLoopGroup(1) 因为NioServerSocketChannel只会与1个boss绑定,注册,所以不需要设置成1
        EventLoopGroup work = new NioEventLoopGroup();  //负责读写操作  此处不设置,会根据cpu核数  cpu*2
        new ServerBootstrap().group(boss, work)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){
                            @Override
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                ByteBuf bb = (ByteBuf) msg;
                                log.debug(bb.toString(Charset.defaultCharset()));
                            }
                        });
                    }
                }).bind(8000);

继续细化

//细分2  创建一个独立EventLoopGroup

        EventLoopGroup group = new DefaultEventLoop();

        EventLoopGroup boss = new NioEventLoopGroup();  //只负责accept事件 不需要设置成1 new NioEventLoopGroup(1) 因为NioServerSocketChannel只会与1个boss绑定,注册,所以不需要设置成1
        EventLoopGroup work = new NioEventLoopGroup();  //负责读写操作  此处不设置,会根据cpu核数  cpu*2
        new ServerBootstrap().group(boss, work)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        ch.pipeline().addLast("handler1", new ChannelInboundHandlerAdapter(){
                            @Override
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                ByteBuf bb = (ByteBuf) msg;
                                log.debug(bb.toString(Charset.defaultCharset()));
                                ctx.fireChannelRead(msg);
                            }
                        }).addLast(group, "handler2", new ChannelInboundHandlerAdapter(){
                            @Override
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                ByteBuf bb = (ByteBuf) msg;
                                log.debug(bb.toString(Charset.defaultCharset()));
                            }
                        });
                    }
                }).bind(8000);

        //多路服用  1个work线程管理多channel
### Netty EventLoop 工作原理 #### 事件循环机制概述 Netty 的 `EventLoop` 是框架中的核心组件之一,主要职责在于管理并处理 I/O 操作。通过采用事件驱动模式,能够有效地应对大量的并发连接请求,在维持高性能的同时确保资源消耗处于合理水平[^4]。 #### NioEventLoop 组件解析 具体到实现层面,推荐使用的 `NioEventLoop` 类承担着关键角色。此类内部封装了一个无限循环的 `run()` 方法,此方法用于持续监听网络事件的发生,并据此触发相应的处理器逻辑;与此同时还支持异步任务提交功能,允许开发者将自定义的任务加入队列等待被执行[^1]。 ```java public class CustomTask implements Runnable { @Override public void run() { System.out.println("Executing custom task"); } } // 提交任务给 EventLoop 执行 eventLoop.submit(new CustomTask()); ``` #### 多线程协作模型 为了更好地适应不同场景下的性能需求,Netty 设计了一套灵活可配置的多线程协作方案。其中最常见的是基于主从结构的多线程模型:一组专门负责接收新连接请求的 boss 线程(即所谓的 acceptor),以及若干个工作线程 worker 来分别处理已建立连接上的读写操作等业务流程。这种分工合作的方式不仅提高了系统的吞吐量,也增强了稳定性与可靠性[^3]。 ### 使用方法 #### 初始化 EventLoopGroup 创建服务端程序时通常会涉及到两个类型的 `EventLoopGroup` 对象实例化过程——一个是用来接受客户端连接请求的 Boss Group ,另一个则是真正从事数据传输工作的 Worker Group 。对于大多数应用场景而言,默认参数设置已经足够满足日常开发所需[^2]: ```java EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 单个Boss线程即可胜任accept工作 EventLoopGroup workerGroup = new NioEventLoopGroup(); // 可依据CPU核数自动调整Worker数量 try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } ``` #### 注册 ChannelHandler 当有新的 TCP 连接到来之后,可以通过向对应的 channel pipeline 添加 handler 的方式来指定具体的业务逻辑处理单元。这些 handlers 将按照链式调用顺序依次作用于每一条消息上,直至完成整个通信周期内的所有交互行为。 ```java b.childHandler(new ChannelInitializer<SocketChannel>() { protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // Add your own handlers here... p.addLast(new MyCustomHandler()); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值