当前位置: 首页 > news >正文

netty 线程组

我们的bossgroup和workgroup都是使用的NioEventLoopGroup。其内部有一个EventExecutor类型的数组用来存储所有的线程组。

NioEventLoopGroup {EventExecutor[] children;
}

NioEventLoopGroup继承自MultithreadEventExecutorGroup,构造函数不指定线程数默认会根据系统cpu进行计算获取。是一个线程池实现类。

在MultithreadEventExecutorGroup构造函数里初始化children。调用newChild方法创建NioEventLoop实例赋给children。EventExecutor[] children 元素实例类型是NioEventLoop。

来看下具体代码:

protected MultithreadEventExecutorGroup(int nThreads, Executor executor,EventExecutorChooserFactory chooserFactory, Object... args) {checkPositive(nThreads, "nThreads");if (executor == null) {//executor 初始化executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());}children = new EventExecutor[nThreads];for (int i = 0; i < nThreads; i ++) {boolean success = false;try {//newChild方法就是创建一个NioEventLoop实例,设置executorchildren[i] = newChild(executor, args);success = true;}}//...
}

executor是ThreadPerTaskExecutor类型,其execute方法就是创建一个线程执行runnable参数任务。

public final class ThreadPerTaskExecutor implements Executor {private final ThreadFactory threadFactory;public ThreadPerTaskExecutor(ThreadFactory threadFactory) {this.threadFactory = ObjectUtil.checkNotNull(threadFactory, "threadFactory");}@Overridepublic void execute(Runnable command) {threadFactory.newThread(command).start();}
}

newChild方法就是创建一个NioEventLoop实例,设置executor。

NioEventLoop是一个很重要的类,很多事件逻辑都是在该类中完成。

下面是NioEventLoop类主要方法。
在这里插入图片描述

NioEventLoop继承自SingleThreadEventExecutor。是一个单线程处理类。我们创建的channel都会和该类进行绑定。

主要属性

属性名说明
taskQueue任务队列,被执行的任务首先会被放到任务队列。
executor执行器,上面创建child传入ThreadPerTaskExecutor类型
selector绑定的selector
thread当前EventLoop的运行线程

主要方法

方法说明
register(Channel channel)绑定channel
addTask(Runnable task)新增一个任务到TaskQueue
pollTask()取出一个任务
startThread()启动线程,会判断当前EventLoop内的线程状态,线程是否已运行,否则调用 doStartThread()启动线程
doStartThread()会调用executor.execute(Runnable)启动一个线程运行入参任务,将启动线程赋值给thread变量。入参会调用run()方法。
execute(Runnable task)执行一个任务,首先会调用addTask加入队列,然后判断是否wakeup执行线程
inEventLoop(Thread thread)判断当前线程和内部变量thread是否是同一个线程
runAllTasks(long timeoutNanos)执行任务队列里的任务
select(curDeadlineNanos)调用Selector的select方法,阻塞监听事件发生
processSelectedKeys();处理监听到的SelectedKeys
processSelectedKey(SelectionKey k, AbstractNioChannel ch)处理具体的某一key事件
http://www.lryc.cn/news/167130.html

相关文章:

  • Reactor 第十二篇 WebFlux集成PostgreSQL
  • 红队打靶:Me and My Girlfriend打靶思路详解(vulnhub)
  • Mysql高级——索引(2)
  • 【史上最硬核分享】Docker+jenkinsPipeline 运行实现 python 自动化(超详细)
  • leetcode 3. 无重复字符的最长子串
  • doccano 文本标注工具使用
  • 快速排序算法的递归和非递归
  • Maven无法拉取SNAPSHOT依赖的解决办法
  • day16-面向对象综合练习(上)
  • 在Windos 10专业版搭建Fyne(Go 跨平台GUI)开发环境
  • 漫谈:C、C++字符串的困局
  • 基于python+selenium的自动批量添加
  • gdb监视
  • STM32基础知识点总结
  • Python vs C#:首先学习哪种编程语言最好?
  • 代理IP和Socks5代理:跨界电商与全球爬虫的关键技术
  • CentOS 7 调优之周期性的访问中断
  • SpringBoot表现层数据一致性
  • vue路由-两个树形结构数据-递归处理方法
  • JSP SSM 成果展示系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • 脚本:python绘制七夕爱心
  • L1 项目概述与Hadoop部署
  • 关键词文章生成器-标题文章生成器
  • 深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数
  • Ubuntu22.04开启后屏幕黄屏
  • 华为云云耀云服务器L实例评测 | 搭建docker环境
  • exesql=“UPDATE test set date=‘%s‘“ % date 是啥意思
  • 请体验一下falcon 180b 大语言模型的感觉
  • 今晚8点,iPhone15开启预售
  • Meetup 回顾|Data Infra 研究社第十五期(含资料发布)