Java教程:Netty知识点详解(六)

开课吧开课吧锤锤2021-02-23 15:00

近年来,随着云计算、大数据等热门技术的发展和普及,Java在企业中越来越受到重视,公司对于Java人才需求也是每年都在增长,对于这样热门的行业,很多人都是心动的,那么对于如何学习,怎么提高Java的技术,那就来看看本篇文章吧。

Java

NioEventLoopGroup 初始化分析

首先根据 Server 服务端代码,分析 NioEventLoopGroup 的初始化过程。而在分析 NioEventLoopGroup 之前,有必要简单的说一说 NioEventLoopGroup 与 NioEventLoop ,方便后续源码的理解。

NioEventLoop 源码分析前了解

NioEventLoop 的继承体系

Java

从 NioEventLoop 的继承体系中可以看到,NioEventLoop 本身就是一个 Executor,并且还是一个 单线程的 Executor。Executor 必然拥有一个 execute(Runnable command) 的实现方法,而 NioEventLoop 的 execute() 实现方法在其父类 SingleThreadEventExecutor 中,找到具体代码:

    public void execute(Runnable task) {

        if (task == null) {

            throw new NullPointerException("task");

        }

        boolean inEventLoop = inEventLoop();

        addTask(task);

        if (!inEventLoop) {

            startThread();

            if (isShutdown()) {

                boolean reject = false;

                try {

                    if (removeTask(task)) {

                        reject = true;

                    }

                } catch (UnsupportedOperationException e) {

                    // The task queue does not support removal so the best thing we can do is to just move on and

                    // hope we will be able to pick-up the task before its completely terminated.

                    // In worst case we will log on termination.

                }

                if (reject) {

                    reject();

                }

            }

        }

        if (!addTaskWakesUp && wakesUpForTask(task)) {

            wakeup(inEventLoop);

        }

    }

这里不细说,但是贴出这段代码主要为了引出 startThread(); 这句代码,在跟这句代码会发现,它最终调用了 NioEventLoop 的一个成员 Executor 执行了当前成员的 execute() 方法。对应的成员 io.netty.util.concurrent.SingleThreadEventExecutor#executor

Java

而 executor 成员的初始化也是在当前代码执行时创建的匿名 Executor ,也就是执行到即新建并且执行当前 匿名 executr() 方法。

总结:

1、NioEventLoop 本身就是一个 Executor。

2、NioEventLoop 内部封装这一个新的线程 Executor 成员。

3、NioEventLoop 有两个 execute 方法,除了本身的 execute() 方法对应的还有成员属性 Executor 对应的 execute() 方法。

备注: 因为这里出现了四个 Executor,为了区分,我们给其新的名称:

NioEventLoop 本身 Executor:NioEventLoop

NioEventLoop 的成员 Executor:子 Executor

NioEventLoopGroup 本身 Executor :NioEventLoopGroup

NioEventLoopGroup 的构造参数 Executor :总Executor

以上内容由开课吧老师敖丙提供,更多Java教程尽在开课吧广场Java教程频道。更多免费课程可以关注公众号“码农集散地”

上一篇:Java教程:Netty知识点详解(七)下一篇:Java教程:Netty知识点详解(五)

最新文章

文章图0

如何在大规模 Kubernetes 集群上实现高 SLO?

Pod创建成功率:这是一个非常重要的指标,蚂蚁集团一周的Pod创建量在百万级别,如果成功率波动会造成大量Pod失败,同时Pod成功率下跌也是集群异常的最直观反映;

2021-03-05 16:20:04

文章图1

MySQL不建议delete删除数据的原因是什么?(二)

MySQL内部不会真正删除空间,而且做标记删除,即将delflag:N修改为delflag:Y,commit之后会会被purge进入删除链表,如果下一次insert更大的记录,delete之后的空间不会被重用,如果插入的记录小于等于delete的记录空会被重用,这块内容可以通过知数堂的innbloc

2021-03-05 11:45:44

文章图2

MySQL不建议delete删除数据的原因是什么?(一)

物理上主要由系统用户数据文件,日志文件组成,数据文件主要存储MySQL字典数据和用户数据,日志文件记录的是datapage的变更记录,用于MySQLCrash时的恢复。

2021-03-05 11:36:22

文章图3

Java教程:MySQL如何设计索引更高效?(五)

同时也介绍了如何更好做MySQL索引设计,包括前缀索引,复合索引的顺序问题以及MySQL8.0推出的索引跳跃扫描,我们都知道,索引可以加快数据的检索,减少IO开销,会占用磁盘空间,是一种用空间换时间的优化手段,同时更新操作会导致索引频繁的合并分裂,影响索引性能,在实际的业务开发中,如何根据业务场景去

2021-03-05 11:29:12

文章图4

Java教程:MySQL如何设计索引更高效?(四)

在单列索引不能很好的过滤数据的时候,可以结合where条件中其他字段来创建复合索引,更好的去过滤数据,减少IO的扫描次数,举个例子:业务需要按照时间段来查询交易记录,有如下的SQL:

2021-03-05 11:25:02