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

云南建设厅官方网站商品seo关键词优化

云南建设厅官方网站,商品seo关键词优化,网站建设方案概述,广州微网站建设市场前言 在前面的一篇博文中有写到:当执行器组EventLoopGroup在执行register(Channel channel)方法注册通道时,首先后会使用next()方法从执行器组中选择一个执行器来执行。至于next()方法如何去选择一个执行器,就是本文要聊的东东。 Netty的执…

前言

在前面的一篇博文中有写到:当执行器组EventLoopGroup在执行register(Channel channel)方法注册通道时,首先后会使用next()方法从执行器组中选择一个执行器来执行。至于next()方法如何去选择一个执行器,就是本文要聊的东东。

Netty的执行器选择器工厂与选择器

在NioEventLoopGroup实例化过程中,会调用其父类的MultithreadEventExecutorGroup构造方法,如果没有传入选择器工厂,则使用默认的DefaultEventExecutorChooserFactory。

MultithreadEventExecutorGroup中的构造方法:

    protected MultithreadEventExecutorGroup(int nThreads, Executor executor, Object... args) {//使用DefaultEventExecutorChooserFactory对象作为选择器工厂//继续调用其他构造方法this(nThreads, executor, DefaultEventExecutorChooserFactory.INSTANCE, args);}

其中DefaultEventExecutorChooserFactory.INSTANCE返回的是一个单例模式下的DefaultEventExecutorChooserFactory对象。

public final class DefaultEventExecutorChooserFactory implements EventExecutorChooserFactory {//默认的执行器选择器工厂public static final DefaultEventExecutorChooserFactory INSTANCE = new DefaultEventExecutorChooserFactory();/**  省略其他代码*/
}

跟进MultithreadEventExecutorGroup的另一个构造方法中:
(省略了大量与本文内容无关的代码)

//这里传入的chooserFactory就是上面的构造方法中说的DefaultEventExecutorChooserFactory对象
protected MultithreadEventExecutorGroup(int nThreads, Executor executor,EventExecutorChooserFactory chooserFactory, Object... args) {checkPositive(nThreads, "nThreads");//创建执行器数组,存储执行器children = new EventExecutor[nThreads];/*省略与本文内容无关的代码*///创建一个执行器选择器chooser = chooserFactory.newChooser(children);/*省略与本文内容无关的代码*/}

在这个构造方法中,首先会根据线程数量来创建一个执行器数组,然后使用选择器工厂chooserFactory的newChooser方法来创建选择器。

然后,继续跟入DefaultEventExecutorChooserFactory的newChooser方法:

    public EventExecutorChooser newChooser(EventExecutor[] executors) {//如果执行器的数量是2的倍数if (isPowerOfTwo(executors.length)) {return new PowerOfTwoEventExecutorChooser(executors);} else {//普通选择器return new GenericEventExecutorChooser(executors);}}

这里,首先调用isPowerOfTwo判断执行器数量是不是2的幂,

    //判断是否是2的次幂private static boolean isPowerOfTwo(int val) {return (val & -val) == val;}

(val & -val) == val是一种快速判断val是不是2的幂的方法, -val 表示n的二进制补码的相反数。(val & -val)的结果是n的二进制表示中最右边的 1所对应的位。这意味着只有当val是2的幂时,(val & -val)的结果才等于val。

如果执行器的数量是2的幂,则使用PowerOfTwoEventExecutorChooser作为选择器,

    //如果执行器的数量是2的倍数private static final class PowerOfTwoEventExecutorChooser implements EventExecutorChooser {//从0开始的计数器private final AtomicInteger idx = new AtomicInteger();//执行器数组private final EventExecutor[] executors;//构造方法PowerOfTwoEventExecutorChooser(EventExecutor[] executors) {this.executors = executors;}//选择其中一个执行器@Overridepublic EventExecutor next() {return executors[idx.getAndIncrement() & executors.length - 1];}}

在PowerOfTwoEventExecutorChooser中,会定义一个从0开始的计数器,每次执行next()选择执行器以后,会将计数器的值增加1,根据计数器的值idx使用“ idx & executors.length - 1”方法来快速取模。
在Java语言中,算术运算符的优先级比位运算符高,因此“idx & executors.length - 1”等同于
“idx & (executors.length - 1)”。
当idx 为2的幂时,“idx & (executors.length - 1)”结果等于“idx % (executors.length - 1)”。

这种快速取模法和HashMap源码中的计算节点在哈希表位置时使用的快速取模法一模一样,只不过HashMap用的是哈希值和数组长度减去1后进行位运算。
我觉得,HashMap中哈希表的扩容之所以要以2倍来扩容,有一部分原因就是为了保证哈希表的长度始终是2的幂,这样就节点插入时就能使用这种快速取模法。

如果执行器的数量不是2的幂,则会使用GenericEventExecutorChooser作为选择器。

    private static final class GenericEventExecutorChooser implements EventExecutorChooser {//创建一个从0 开始的计数器private final AtomicLong idx = new AtomicLong();//执行器数组private final EventExecutor[] executors;GenericEventExecutorChooser(EventExecutor[] executors) {this.executors = executors;}@Overridepublic EventExecutor next() {return executors[(int) Math.abs(idx.getAndIncrement() % executors.length)];}}

逻辑和上面的基本一样,只不过取模方式是用“%”算术运算符来进行取模。

总结与思考

Netty中的执行器选择策略很简单,使用一个每次递增的计数器,然后每次执行next()选取执行器时,将计数器的值和执行器的数量进行取模。根据执行器的数量是不是2的幂,决定使用快速取模法和普通取模法。

不过笔者对这个DefaultEventExecutorChooserFactory代码有点疑问,在PowerOfTwoEventExecutorChooser 选择器中,其计数器使用的是AtomicInteger类型;在GenericEventExecutorChooser选择器中,其计数器使用的是AtomicLong型。为什么要不一样呢?

http://www.cadmedia.cn/news/1883.html

相关文章:

  • 建设银行手机绑定网站如何做网站
  • 南山网站建设公司乐云seo上海网站推广系统
  • 做阀门网站效果怎么样网络整合营销方案ppt
  • 自助业务商城百度关键词排名优化
  • 太原新站优化河南品牌网络推广外包
  • 东莞网站建设求职简历抖音关键词排名系统
  • 建晨网站建设发布新闻的平台有哪些
  • 常州网站建设外包公司夫唯老师seo
  • 建设信访建设网站的意义怎么开发一个网站
  • 广东汽车品牌网站建设网站推广怎么做才有效果
  • 263企业邮箱登录入口手机版福州seo经理招聘
  • 上街区做网站整站多关键词优化
  • 西安房产网站建设怎样建网站
  • 磁县邯郸网站建设网络营销八大职能
  • 科协网站建设的意见常州网站seo
  • 手机网站模板网林云seo博客
  • 建设大型网站什么是整合营销概念
  • 网站开发计入什么费用免费友情链接网站
  • 可以做任务赚钱的网站推广网站制作
  • 网站推广优化外包公司哪家好东莞seo关键词
  • 深圳公司做年报网站杭州谷歌seo公司
  • 品牌建设运营规划网站优化公司哪家效果好
  • 深圳网站建设做一个公司网站要多少钱seo技术教程网
  • 企业网站推广17百度小说风云榜排名
  • 动态购物网站开发源代码推广衣服的软文
  • 网站设计参考文献seo策略工具
  • 中国建设银行 英文网站市场监督管理局官网入口
  • 免费的外贸网站推广方法子域名查询工具
  • 珠海网站制作哪家便宜厦门网站快速排名优化
  • 小米网站建设书如何自己弄一个网站