博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解密netty是怎么玩线程池
阅读量:4135 次
发布时间:2019-05-25

本文共 931 字,大约阅读时间需要 3 分钟。

  netty如此强大和优秀的通信框架,是如何封装和使用线程池的。

  其实这一点我是非常的好奇,我们在使用netty的时候,似乎没有感受到哪里有线程池相关的操作。

   这篇文章解密 netty使用线程池的精妙绝伦的地方。

netty中和线程池相关的东西

  我截取了一份netty服务端的代码,如下:

 

  上图中的EventLoopGroup 实际上就是线程池,只不过netty是基于事件驱动的,它想要把一切都描述的和事件相关,所以它给线程池套上了一个事件马甲,然后叫做 “事件循环组”。

  证据如下:我们点进去 NioEventLoopGroup,可以看到,它继承自 MultithreadEventLoopGroup ,从名字就可以看出来,多线程事件循环组。

  如果我们不填写线程的个数,它默认是0,然后我们再点进去 MultithreadEventLoopGroup

  可以看到下图点进去的内容:静态代码块初始化了线程的个数,这回是根据当前环境下的内核的个数 * 2 来当做最大线程数的。

  接着再看下边,这依旧是MultithreadEventLoopGroup点进来看到的:实际上如果你制定了线程数,那么就用你的线程数,如果没有指定,则使用默认的,也就是 内核数*2 。

再来看一下netty是如何来嵌入多线程

  如下图:红色的实际上就是 EventLoop,这是实际上就是绑定一个线程。 而EventLoopGroup实际上是实现了 EventExecutorGroup,它是具有绿色框的功能,包括了任务调度。

线程池是如何和netty中的组件对应的

  EventLoopGroup  ——> 线程池

  EventLoop ——> 提前创建出来的工作线程

  channel ——>  任务执行单元,相当于是继承了 Thread类,或者实现了 Runnable接口的类

 

netty中使用线程池的一个精髓点

  也是netty的设计上的一个需求吧,它期望进来的一个任务,一旦被分配到某个 EventLoop上,那么此后都被它执行。也就是 EventLoop 和 channel 是一个强绑定的关系。

  另外EventLoop也是维护了一个任务队列。上边的需求,实际上避免了线程与线程之间的数据同步。 

转载地址:http://jmsvi.baihongyu.com/

你可能感兴趣的文章
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>
判断一个整数是否是回文数
查看>>
经典shell面试题整理
查看>>
腾讯的一道面试题—不用除法求数字乘积
查看>>
素数算法
查看>>
java多线程环境单例模式实现详解
查看>>
将一个数插入到有序的数列中,插入后的数列仍然有序
查看>>
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>
程序员失误造成服务停用3小时,只得到半月辞退补偿,发帖喊冤
查看>>
码农:很多人称我“技术”,感觉这是不尊重!纠正无果后果断辞职
查看>>
php程序员看过来,这老外是在吐糟你吗?看看你中了几点!
查看>>
为什么说程序员是“培训班出来的”就是鄙视呢?
查看>>
码农吐糟同事:写代码低调点不行么?空格回车键与你有仇吗?
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>