Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NioEventLoop 是一个线程的线程池

NioEventLoop 是一个线程的线程池

原创
作者头像
乐事
修改于 2020-05-11 02:52:09
修改于 2020-05-11 02:52:09
90700
代码可运行
举报
文章被收录于专栏:日常笔记日常笔记
运行总次数:0
代码可运行

我们现在知道, 当一个新的客户端连接到服务器时, 通过选择器EventExecutorChooser选择一个NioEventLoop为其服务. 那么其实最终是由NioEventLoop封装的Thread为其服务. 在前面我们也说过, 在创建NioEventLoop时会创建线程选择器ThreadPerTaskExecutor, 由这个选择器创建底层的线程.下面我们就来说说这个选择器.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());public ThreadPerTaskExecutor(ThreadFactory threadFactory) {
    this.threadFactory = threadFactory;
}
@Override
public void execute(Runnable command) {
    threadFactory.newThread(command).start();
}

我们先说一下这个ThreadFactory. 它的默认实现如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public DefaultThreadFactory(String poolName, boolean daemon, int priority, ThreadGroup threadGroup) {
    prefix = poolName + '-' + poolId.incrementAndGet() + '-';
    this.daemon = daemon;
    this.priority = priority;
    this.threadGroup = threadGroup;
}

我们看到, prefix = nioEventLoop-1- 如果是第二个NioEventLoop, 那么它的名称就叫做nioEventLoop-2- 以此类推.而且daemon=false . 而且底层创建的线程并不是JDK的Thread类线程, 而是Netty自己设计的线程类, 叫做FastThreadLocalThread . 从名字上可以看得出来, 这个线程类比JDK的线程类性能要快, 实际的确快,

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Netty源码—2.Reactor线程模型一
答:默认是2倍CPU核数个线程。在调用EventExcutor的execute(task)方法时,会判断当前线程是否为Netty的Reactor线程,也就是判断当前线程是否为NioEventLoop对应的线程实体。如果是,则说明Netty的Reactor线程已经启动了。如果不是,则说明是外部线程调用EventExcutor的execute()方法。于是会先调用startThread()方法判断当前线程是否已被启动,如果还没有被启动就启动当前线程作为Netty的Reactor线程。
东阳马生架构
2025/05/27
1640
NioEventLoopGroup源码解析
我们前面说到过,NioEventLoopGroup我们可以近乎把它看作是一个线程池,该线程池会执行一个一个的任务,我们常用的NioEventLoopGroup大概有两种,NioEventLoopGroup(int nThreads),NioEventLoopGroup(),即一个是指定线程数量的,一个是默认指定线程数量的!这里我们以无参构造为入口进行分析!
止术
2021/07/16
8170
NioEventLoopGroup源码解析
netty源码分析之EventLoop中的线程FastThreadLocalThread和队列
它继承自SingleThreadEventLoop,它的超类是SingleThreadEventExecutor。而在下面你会发现NioEventLoopGroup中维护着多个SingleThreadEventExecutor。先来看下NioEventLoop和SingleThreadEventLoop、SingleThreadEventExecutor的代码。
山行AI
2020/04/07
1.4K1
netty源码分析之EventLoop中的线程FastThreadLocalThread和队列
netty源码分析二之EventLoopGroup初始化
这里的DEFAULTEVENTLOOP_THREADS的默认值是cpu核数乘以2:
山行AI
2019/10/24
7430
小米面试:如何实现优先级线程池?
我们知道,线程池中的所有线程都是由统一的线程工厂来创建的,当我们指定线程工厂时,线程池中的所有线程会使用我们指定的线程工厂来创建线程;但如果没有指定线程工厂,则会使用默认的线程工厂 DefaultThreadFactory 来创建线程,核心源码如下:
磊哥
2024/05/20
1400
第二十节 netty源码分析之 reactor中的EventLoop01
EventLoopGroup (如果使用到的是 NIO, 那么通常是 NioEventLoopGroup), 那么这个 NioEventLoopGroup 在 Netty 中到底扮演着什么角色呢?
用户1418372
2019/03/11
4010
第二十节  netty源码分析之 reactor中的EventLoop01
Java 的线程工厂 ThreadFactory原理及源码详解
在我们一般的使用中,创建一个线程,通常有两种方式: 继承Thread类,覆盖run方法,实现我们需要的业务 继承Runnable接口,实现run方法,实现我们需要的业务,并且调用new Thread(Runnable)方法,将其包装为一个线程执行
JavaEdge
2020/05/26
7K0
不会吧,就是你把线程池讲的这么清楚的?
我们知道,在计算机中创建一个线程和销毁一个线程都是十分耗费资源的操作,有一种思想叫做,池化思想,就是说我们创建个池子,把耗费资源的操作都提前做好,后面大家一起用创建好的东西,用完了就放回池子里,谁用谁取,最后统一销毁。省去了用一次创建一次,销毁一次,这种耗费资源的操作。线程池就是这种思想。
java小杰要加油
2021/05/13
5060
不会吧,就是你把线程池讲的这么清楚的?
【Netty之旅四】你一定看得懂的Netty客户端启动源码分析!
源码系列的文章依旧还是遵循大白话+画图的风格来讲解,本文Netty源码及以后的文章版本都基于:4.1.22.Final
一枝花算不算浪漫
2020/09/24
7150
【Netty之旅四】你一定看得懂的Netty客户端启动源码分析!
NioEventLoopGroup 源码分析
NioEventLoopGroup 源码分析 1. 在阅读源码时做了一定的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限。为了方便 IDE 查看、跟踪、调试 代码,所以在 github 上提供 netty 的源码、详细的注释及测试用例。欢迎大家 star、fork ! 2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢!    从今天开始,就准备进军 ne tty 了,主要的想法是看看 netty4 中一些比较重要的实现,也就是能经常出现在我
lwen
2018/04/17
6800
Java线程池扩展之关联线程池与业务
Java API针对不同需求,利用Executors类提供了4种不同的线程池:newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newSingleThreadExecutor。我们以创建固定线程池为例,说明创建线程池的一般做法:
九州暮云
2019/08/21
6800
Java线程池扩展之关联线程池与业务
线程的创建、Lambda函数式接口?Runnable和Callable之间的适配?动态修改线程任务?这里带你图解Java线程池
这里为了便于叙述,毕竟不是本次的重点,我直接上源码,没基础的可以去找些其他资料来补一补
程序员Jony
2023/08/11
1K0
线程的创建、Lambda函数式接口?Runnable和Callable之间的适配?动态修改线程任务?这里带你图解Java线程池
Java线程池深入理解
之前面试baba系时遇到一个相对简单的多线程编程题,即"3个线程循环输出ADC",自己答的并不是很好,深感内疚,决定更加仔细的学习《并发编程的艺术》一书,到达掌握的强度。(之前两月休息时间都花在了lo
用户1216676
2018/01/24
1.9K0
JDK源码分析 线程池
对于JDK源码分析的文章,仅仅记录我认为重要的地方。源码的细节实在太多,不可能面面俱到地写清每个逻辑。所以我的JDK源码分析,着重在JDK的体系架构层面,具体源码可以参考:http://www.cnblogs.com/skywang12345/category/455711.html。
Yano_nankai
2018/10/08
3740
JDK源码分析 线程池
Java线程池核心原理剖析
在系统开发时,我们经常会遇到“池”的概念。使用池一种以空间换时间的做法,通常在内存中事先保存一系列整装待命的对象,以供后期供其他对象随时调用。常见的池有:数据库连接池,socket连接池,线程池等。今天我们就来看一下线程池的概念。
Java学习录
2019/04/18
4670
reactor-netty中TcpClient的create过程
本文主要研究一下reactor-netty中TcpClient的create的过程
code4it
2018/09/17
2K0
Java高并发之线程池详解
在业务场景中, 如果一个对象创建销毁开销比较大, 那么此时建议池化对象进行管理。例如线程, jdbc连接等等, 在高并发场景中, 如果可以复用之前销毁的对象, 那么系统效率将大大提升。另外一个好处是可以设定池化对象的上限, 例如预防创建线程数量过多导致系统崩溃的场景.
用户1269200
2018/07/30
4820
Java高并发之线程池详解
Netty14# 池化内存之线程缓存
在前面文章『Netty12# 池化内存框架流程』Netty会将不同的内存尺寸缓存起来,每个线程绑定了专属逻辑内存区域(PoolArena),减少资源竞争。每个线程绑定了缓存PoolThreadCache,内存分配时,先从当前线程绑定的PoolThreadCache缓存分配。
瓜农老梁
2021/03/16
7260
JUC学习笔记(四)—线程池
线程池 【死磕Java并发】—–J.U.C之线程池:ThreadPoolExecutor
Monica2333
2020/06/19
5710
你不知道的线程池构造方法的那些趣事?
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。
彤哥
2019/10/20
4700
推荐阅读
相关推荐
Netty源码—2.Reactor线程模型一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档