最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty源碼分析NioEventLoop初始化線程選擇器創(chuàng)建

 更新時(shí)間:2022年03月25日 14:57:00   作者:向南是個(gè)萬人迷  
這篇文章主要介紹了Netty源碼分析NioEventLoop初始化線程選擇器創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前文傳送門:NioEventLoop創(chuàng)建

初始化線程選擇器

回到上一小節(jié)的MultithreadEventExecutorGroup類的構(gòu)造方法:

protected MultithreadEventExecutorGroup(int nThreads, Executor executor, 
                                        EventExecutorChooserFactory chooserFactory, Object... args) {
    //代碼省略
    if (executor == null) {
        //創(chuàng)建一個(gè)新的線程執(zhí)行器(1)
        executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
    }
    //構(gòu)造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 {
           //代碼省略
        }
    }
    //創(chuàng)建線程選擇器(3)
    chooser = chooserFactory.newChooser(children);
    //代碼省略
}

我們看第三步, 創(chuàng)建線程選擇器:

chooser = chooserFactory.newChooser(children);

NioEventLoop都綁定一個(gè)chooser對象, 作為線程選擇器, 通過這個(gè)線程選擇器, 為每一個(gè)channel分配不同的線程

我們看到newChooser(children)傳入了NioEventLoop數(shù)組

我們跟到DefaultEventExecutorChooserFactory類中的newChooser方法:

public EventExecutorChooser newChooser(EventExecutor[] executors) { 
    if (isPowerOfTwo(executors.length)) { 
        return new PowerOfTowEventExecutorChooser(executors);
    } else {
        return new GenericEventExecutorChooser(executors);
    }
}

這里通過 isPowerOfTwo(executors.length) 判斷NioEventLoop的線程數(shù)是不是2的倍數(shù), 然后根據(jù)判斷結(jié)果返回兩種選擇器對象, 這里使用到j(luò)ava設(shè)計(jì)模式的策略模式

根據(jù)這兩個(gè)類的名字不難看出, 如果是2的倍數(shù), 使用的是一種高性能的方式選擇線程, 如果不是2的倍數(shù), 則使用一種比較普通的線程選擇方式

我們簡單跟進(jìn)這兩種策略的選擇器對象中看一下, 首先看一下PowerOfTowEventExecutorChooser這個(gè)類:

private static final class PowerOfTowEventExecutorChooser implements EventExecutorChooser {
    private final AtomicInteger idx = new AtomicInteger();
    private final EventExecutor[] executors;
    PowerOfTowEventExecutorChooser(EventExecutor[] executors) {
        this.executors = executors;
    }
    @Override
    public EventExecutor next() {
        return executors[idx.getAndIncrement() & executors.length - 1];
    }
}

這個(gè)類實(shí)現(xiàn)了線程選擇器的接口EventExecutorChooser, 構(gòu)造方法中初始化了NioEventLoop線程數(shù)組

重點(diǎn)關(guān)注下next()方法, next()方法就是選擇下一個(gè)線程的方法, 如果線程數(shù)是2的倍數(shù), 這里通過按位與進(jìn)行計(jì)算, 所以效率極高

再看一下GenericEventExecutorChooser這個(gè)類:

private static final class GenericEventExecutorChooser implements EventExecutorChooser {
    private final AtomicInteger idx = new AtomicInteger();
    private final EventExecutor[] executors;
    GenericEventExecutorChooser(EventExecutor[] executors) {
        this.executors = executors;
    }
    @Override
    public EventExecutor next() {
        return executors[Math.abs(idx.getAndIncrement() % executors.length)];
    }
}

這個(gè)類同樣實(shí)現(xiàn)了線程選擇器的接口EventExecutorChooser, 并在造方法中初始化了NioEventLoop線程數(shù)組

再看這個(gè)類的next()方法, 如果線程數(shù)不是2的倍數(shù), 則用絕對值和取模的這種效率一般的方式進(jìn)行線程選擇

這樣, 我們就初始化了線程選擇器對象

以上就是Netty源碼分析NioEventLoop初始化線程選擇器創(chuàng)建的詳細(xì)內(nèi)容,更多關(guān)于Netty線程選擇器NioEventLoop的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java for each實(shí)現(xiàn)機(jī)制代碼原理解析

    Java for each實(shí)現(xiàn)機(jī)制代碼原理解析

    這篇文章主要介紹了Java for each實(shí)現(xiàn)機(jī)制代碼原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java自定義比較器實(shí)現(xiàn)中文排序

    Java自定義比較器實(shí)現(xiàn)中文排序

    這篇文章主要介紹了Java自定義比較器實(shí)現(xiàn)中文排序,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring框架開發(fā)scope作用域分析總結(jié)

    Spring框架開發(fā)scope作用域分析總結(jié)

    這篇文章主要介紹了Spring框架開發(fā)中scope作用域的分析總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09
  • Java使用POI-TL和JFreeChart動(dòng)態(tài)生成Word報(bào)告

    Java使用POI-TL和JFreeChart動(dòng)態(tài)生成Word報(bào)告

    本文介紹了使用POI-TL和JFreeChart生成包含動(dòng)態(tài)數(shù)據(jù)和圖表的Word報(bào)告的方法,并分享了實(shí)際開發(fā)中的踩坑經(jīng)驗(yàn),通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-02-02
  • NetBeans安裝提示neatbeans cannot find java 1.8 or higher

    NetBeans安裝提示neatbeans cannot find java 1.8 or higher

    今天小編就為大家分享一篇關(guān)于NetBeans安裝提示neatbeans cannot find java 1.8 or higher,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Spring?cloud?Hystrix注解初始化源碼過程解讀

    Spring?cloud?Hystrix注解初始化源碼過程解讀

    這篇文章主要為大家介紹了Hystrix初始化部分,我們從源碼的角度分析一下@EnableCircuitBreaker以及@HystrixCommand注解的初始化過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-12-12
  • Android中比較常見的Java super關(guān)鍵字

    Android中比較常見的Java super關(guān)鍵字

    這篇文章主要為大家介紹了Android中比較常見的Java super關(guān)鍵字,具有一定的學(xué)習(xí)參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 一篇文章帶了解如何用SpringBoot在RequestBody中優(yōu)雅的使用枚舉參數(shù)

    一篇文章帶了解如何用SpringBoot在RequestBody中優(yōu)雅的使用枚舉參數(shù)

    這篇文章主要介紹了SpringBoot中RequestBodyAdvice使用枚舉參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringCloud中Gateway實(shí)現(xiàn)鑒權(quán)的方法

    SpringCloud中Gateway實(shí)現(xiàn)鑒權(quán)的方法

    本文主要介紹了SpringCloud中Gateway實(shí)現(xiàn)鑒權(quán)的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java中isAssignableFrom的用法詳解

    Java中isAssignableFrom的用法詳解

    下面小編就為大家?guī)硪黄狫ava中isAssignableFrom的用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論

中江县| 金塔县| 北碚区| 衡阳县| 永丰县| 仪陇县| 阿拉善右旗| 阜新市| 漳平市| 泰和县| 绥芬河市| 桂东县| 洪洞县| 贵德县| 肥西县| 洞头县| 深泽县| 永顺县| 安平县| 兰西县| 子洲县| 黄浦区| 蛟河市| 紫云| 冷水江市| 晋州市| 望城县| 青铜峡市| 林甸县| 邵东县| 屏南县| 临桂县| 新建县| 长治县| 西安市| 司法| 稻城县| 武鸣县| 孟州市| 绍兴市| 太保市|