13.Netty组件EventLoopGroup和EventLoop介绍

EventLoop 

是一个单线程的执行器(同时维护了一个Selector),里面有run方法处理Channel上源源不断的io事件。

1.继承java.util.concurrent.ScheduledExecutorService因此包含了线程池中所有的方法。

2.继承netty自己的OrderedEventExecutor

 EventLoopGroup

一般不会直接使用EventLoop,而是使用EventLoopGroup。

Channel一般会调用EventLoopGroup的register方法来绑定其中一个EventLoop,后续这个channel上的io事件都由这个EventLoop来处理(保证io事件处理时的线程安全)。

NioEventLoopGroup 与 DefaultEventLoopGroup的区别

EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup();// 处理io事件、定时任务、普通任务
DefaultEventLoopGroup defaultEventLoopGroup = new DefaultEventLoopGroup(); // 定时任务、普通任务

new NioEventLoopGroup() 跟踪源码:

可以看出默认创建的线程数= 电脑cpu核数 x 2 

@Slf4j
public class EventLoopGroupDemo {

    public static void main(String[] args) {
        //创建EventLoopGroup对象,指定线程数量为2
        EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(2);// 处理io事件、定时任务、普通任务
//        DefaultEventLoopGroup defaultEventLoopGroup = new DefaultEventLoopGroup(); // 定时任务、普通任务
        //获取下一个eventLoop对象
        EventLoop eventLoop1 = nioEventLoopGroup.next();
        EventLoop eventLoop2 = nioEventLoopGroup.next();
        EventLoop eventLoop3 = nioEventLoopGroup.next();
        EventLoop eventLoop4 = nioEventLoopGroup.next();
        //只有两个对象,就会循环获取,获取四次,两两相同,看对象的hashcode值
        log.info("eventLoop1={}", eventLoop1); //io.netty.channel.nio.NioEventLoop@4ec6a292
        log.info("eventLoop2={}", eventLoop2); //io.netty.channel.nio.NioEventLoop@1b40d5f0
        log.info("eventLoop3={}", eventLoop3); //io.netty.channel.nio.NioEventLoop@4ec6a292
        log.info("eventLoop4={}", eventLoop4); //io.netty.channel.nio.NioEventLoop@1b40d5f0

        //把一个普通任务提交给EventLoopGroup中某一个EventLoop去执行,异步执行
        //应用场景:
        // 1.如果当前线程的某个任务比较耗时,可以交给EventLoopGroup中的其他线程进行异步处理。
        // 2.任务从一个线程的执行权转到另一个线程。
        nioEventLoopGroup.execute(() ->{
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //[nioEventLoopGroup-2-1] INFO com.xkj.org.netty.EventLoopGroupDemo - execute common task ok
            //nioEventLoopGroup-2-1 就是 EventLoopGroup中一个EventGroup线程的名字
            log.info("execute common task ok");
        });

        //执行定时任务
        //1s后执行,间隔2s执行一次
        nioEventLoopGroup.scheduleAtFixedRate(() -> {
            // [nioEventLoopGroup-2-2] INFO com.xkj.org.netty.EventLoopGroupDemo - ok
            // nioEventLoopGroup-2-2就是 EventLoopGroup中一个EventGroup线程的名字
            log.info("ok"); 
        }, 1, 2, TimeUnit.SECONDS);
        
        log.info("main");
    }
}
  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷土重来…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值