iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Netty源码解析NioEventLoop创建的构造方法
  • 733
分享到

Netty源码解析NioEventLoop创建的构造方法

2024-04-02 19:04:59 733人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录NIOEventLoopGroup之NioEventLoop的创建我们来看第二步构造NioEventLoop我们继续跟到NioEventLoop的构造方法最后跟到Abstract

前文传送门:Netty源码分析 NioEventLoop

NioEventLoopGroup之NioEventLoop的创建

回到上一小节的MultithreadEventExecutorGroup类的构造方法:

protected MultithreadEventExecutorGroup(int nThreads, Executor executor, 
                                        EventExecutorChooserFactory chooserFactory, Object... args) {
    //代码省略
    if (executor == null) {
        //创建一个新的线程执行器(1)
        executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
    }
    //构造NioEventLoop(2)
    children = new EventExecutor[nThreads];
    for (int i = 0; i < nThreads; i ++) {
        boolean success = false;
        try {
            children[i] = newChild(executor, args);
            success = true;
        } catch (Exception e) {
            throw new IllegalStateException("failed to create a child event loop", e);
        } finally {
           //代码省略
        }
    }
    //创建线程选择器(3)
    chooser = chooserFactory.newChooser(children);
    //代码省略
}

我们来看第二步构造NioEventLoop

这里通过 children = new EventExecutor[nThreads] 初始化了children属性, 看下这个属性的定义:

private final EventExecutor[] children

这里的children是EventExecutor类型的数组, 其实就是NioEventLoop的集合, 因为NioEventLoop也是EventExecutor的子类

所以这里初始化了children数组, 大小为参数nThreads传入的线程数量, 默认为cpu核数的两倍

后面就是通过for循环来创建NioEventLoop线程,

在循环体里通过 children[i] = newChild(executor, args) 创建NioEventLoop, 我们跟newChild(executor, args)方法

因为是NioEventLoopGroup调用的,所以跟到NioEventLoop的newChild方法中:

protected EventLoop newChild(Executor executor, Object... args) throws Exception {
    return new NioEventLoop(this, executor, (SelectorProvider) args[0], 
        ((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]);
}

这里我们看到创建了一个NioEventLoop对象, 其中this是NioEventLoopGroup自身, executor就是上一小节讲到的线程执行器

我们继续跟到NioEventLoop的构造方法

NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider, 
             SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) {
    super(parent, executor, false, DEFAULT_MAX_PENDING_TASKS, rejectedExecutionHandler);
    //代码省略
    provider = selectorProvider;
    selector = openSelector();
    selectStrategy = strategy;
}

首先看到了调用了父类的构造方法, 然后初始化了几个属性:

 selector = openSelector() 这种方式创建个NioEventLoop绑定的selector对象, 有关创建过程, 之后会讲到

跟进父类SingleThreadEventLoop类构造方法:

protected SingleThreadEventLoop(EventLoopGroup parent, Executor executor, 
                                boolean addTaskWakesUp, int maxPendingTasks, 
                                RejectedExecutionHandler rejectedExecutionHandler) {
    super(parent, executor, addTaskWakesUp, maxPendingTasks, rejectedExecutionHandler);
    tailTasks = newTaskQueue(maxPendingTasks);
}

再跟到父类SingleThreadEventExecutor构造方法:

protected SingleThreadEventExecutor(EventExecutorGroup parent, Executor executor, 
                                    boolean addTaskWakesUp, int maxPendingTasks, 
                                    RejectedExecutionHandler rejectedHandler) {
    super(parent);
    this.addTaskWakesUp = addTaskWakesUp;
    this.maxPendingTasks = Math.max(16, maxPendingTasks);
    this.executor = ObjectUtil.checkNotNull(executor, "executor");
    taskQueue = newTaskQueue(this.maxPendingTasks);
    rejectedExecutionHandler = ObjectUtil.checkNotNull(rejectedHandler, "rejectedHandler");
}

 this.executor = ObjectUtil.checkNotNull(executor, "executor") 

这里初始化了线程执行器

 taskQueue = newTaskQueue(this.maxPendingTasks) 

是创建一个任务队列, 这个任务队列可以将不属于NioEventLoop线程的任务放到这个任务队列中, 通过NioEventLoop线程执行, 具体使用场景之后我们会看到

跟到父类AbstractScheduledEventExecutor的构造方法中:

protected AbstractScheduledEventExecutor(EventExecutorGroup parent) {
    super(parent);
}

最后跟到AbstractEventExecutor类的构造方法

protected AbstractEventExecutor(EventExecutorGroup parent) {
    this.parent = parent;
}

这里初始化了parent, 这个parent就NioEventLoop所属的线程组NioEventLoopGroup对象

至此, NioEventLoop创建完成

以上就是Netty源码解析NioEventLoop创建的构造方法的详细内容,更多关于Netty NioEventLoop构造方法的资料请关注编程网其它相关文章!

--结束END--

本文标题: Netty源码解析NioEventLoop创建的构造方法

本文链接: https://www.lsjlt.com/news/143896.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Netty源码解析NioEventLoop创建的构造方法
    目录NioEventLoopGroup之NioEventLoop的创建我们来看第二步构造NioEventLoop我们继续跟到NioEventLoop的构造方法最后跟到Abstract...
    99+
    2022-11-13
  • Netty源码分析NioEventLoop初始化线程选择器创建
    前文传送门:NioEventLoop创建 初始化线程选择器 回到上一小节的MultithreadEventExecutorGroup类的构造方法: protected Multith...
    99+
    2022-11-13
  • 基于java构造方法Vector创建对象源码分析
    (注意:本文基于JDK1.8)  前言 Vector是线程安全的动态数组类,提供4个创建Vector对象的构造方法,接下来我们逐个分析每个创建Vector对象的构造方法 ...
    99+
    2022-11-12
  • Spring源码解析之推断构造方法
    Spring推断构造方法 贴个测试代码直接开干,这只是个样例,其他情况自行分析 @Component public class OrderService { public ...
    99+
    2022-11-12
  • Spring源码解析容器初始化构造方法
    目录前言构造方法前言 Spring框架被广泛应用于我们的日常工作中,但是很长时间以来我都是只会使用,不懂它的作用原理。通过最近一段时间的阅读源码,个人发现通过阅读源码,能够帮助我们了...
    99+
    2022-11-13
  • Spring源码解析之推断构造方法的示例分析
    小编给大家分享一下Spring源码解析之推断构造方法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring推断构造方法贴个测试代码直接开干,这只是个...
    99+
    2023-06-15
  • Netty组件NioEventLoopGroup创建线程执行器源码解析
    目录前言第一节:  NioEventLoopGroup之创建线程执行器创建EventLoopGroup的构造方法跟到MultithreadEventExecutorGrou...
    99+
    2022-11-13
  • Spring源码解析容器初始化构造的方法是什么
    这篇“Spring源码解析容器初始化构造的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring源码解析容器初...
    99+
    2023-07-02
  • Netty分布式pipeline管道创建方法跟踪解析
    目录概述pipeline的创建上一章节回顾:Netty分布式源码分析监听读事件 概述 pipeline, 顾名思义, 就是管道的意思, 在netty中,...
    99+
    2022-11-13
  • Golang创建构造函数的方法超详细讲解
    目录组合字面量自定义构造函数从构造函数返回错误interface构造函数最佳实践基本构造函数主包类型多个构造函数组合字面量 组合字面量是最直接方式初始化Go对象,假设定义了Book类...
    99+
    2023-01-28
    Go创建构造函数 Go构造函数
  • Netty分布式ByteBuf的分类方式源码解析
    目录ByteBuf根据不同的分类方式 会有不同的分类结果1.Pooled和Unpooled2.基于直接内存的ByteBuf和基于堆内存的ByteBuf3.safe和unsafe上一小...
    99+
    2022-11-13
  • 基于java构造方法Vector删除元素源码分析
    目录前言remove(int)方法分析remove(Object)方法分析removeElement(Object)方法分析removeElementAt(int)方法分析remov...
    99+
    2022-11-12
  • 基于java构造方法Vector修改元素源码分析
    (注意:本文基于JDK1.8) 前言 增删改查,修改元素,Vector提供了3个方法,包括迭代器中的一个,不过本文只分析Vector自身的两个修改元素的方法,迭代器中的方法将单独分...
    99+
    2022-11-12
  • 基于java构造方法Vector查找元素源码分析
    (注意:本文基于JDK1.8) 前言 元素在存储到内存中,当我们需要使用在内存中存储的元素,这就涉及到在内存中查找元素,今天一起学习Vector提供了哪些查找元素的方法 ...
    99+
    2022-11-12
  • 基于java构造方法Vector遍历元素源码分析
    (注意:本文基于JDK1.8) 前言 任何一个容器类对象用于持有元素后,总是需要遍历元素的,即挨个去访问每个元素1次,而遍历元素,除了常规的依赖于数组对象的下标之外,更常用的是封装好...
    99+
    2022-11-12
  • 基于java构造方法Vevtor添加元素源码分析
    (注意:本文基于JDK1.8) 前言 算上迭代器的add()方法,Vector中一共有7个添加元素的方法,5个添加单个元素的方法,2个添加多个元素的方法,接下来就一起分析它们的实...
    99+
    2022-11-12
  • 深入探究Java线程的创建与构造方法
    目录一、创建线程启动线程—start 方法方法一方法二方法三方法四方法五方法六二、run方法和start方法的区别①方法性质不同②执行速度不同③调用次数不同总结三、线程的...
    99+
    2022-11-13
  • Netty分布式ByteBuf使用的底层实现方式源码解析
    目录概述AbstractByteBuf属性和构造方法首先看这个类的属性和构造方法我们看几个最简单的方法我们重点关注第二个校验方法ensureWritable(length)我们跟到扩...
    99+
    2022-11-13
  • Python 装饰器常用的创建方式及源码示例解析
    目录装饰器简介基础通用装饰器源码示例执行结果带参数装饰器源码示例源码结果源码解析多装饰器执行顺序源码示例执行结果解析类装饰器源码示例执行结果解析装饰器简介 装饰器(decorator...
    99+
    2022-11-10
  • Java源码解析之HashMap的put、resize方法详解
    目录一、HashMap 简介二、源码分析2.1 继承和实现2.2 属性2.3 节点类型Node内部类2.4 红黑树的节点三、构造方法3.1 构造器13.2 构造器23.3 构造器33...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作