美文网首页程序员
netty源码分析(11)-NioEventLoop总结

netty源码分析(11)-NioEventLoop总结

作者: Jorgezhong | 来源:发表于2019-02-21 12:56 被阅读0次

    前面花了5节的篇幅来学习和研究NioEventLoop的创建,启动,执行的过程。总结一下

    • 用户代码再创建boosGroupworkGroup的时候,NioEventLoop被创建,默认不穿参数的时候,创建2倍CPU核心数NioEventLoop
    • 每一个NioEventLoop都会又一个chooser进行线程逻辑的分配,该chooser也会针对NioEventLoop的个数进行一些优化。
    • 创建NioEventLoop的时候会创建一个selector和一个定时任务队列scheduledTaskQueue,并且创建selector的时候,创建了一个数组实现的SelectedSelectionKeySet替换掉原有HashSet实现的两个属性 selectedKeys和publicSelectedKeys
    • NioEventLoop再首次调用execute()方法的时候启动FastThreadLocalThread线程,并保存到成员变量,这样就可以判断执行NioEventLoop执行逻辑的线程是否是当前线程。
    • NioEventLoop的执行逻辑再run()方法,包括三个过程,分别是:
      (1)检测IO事件
      (2)处理这些IO事件
      (3)执行任务队列

    几个问题:

    1. 默认情况下,Netty服务端开启多少个线程?何时启动

    开启2倍的CPU核心数的线程,在调用execute()的时候,会判断当前线程是否是NioEventLoop持有的线程,如果是的话,表示已经启动;不是的话,表面外部线程调用本eventLoop,嗲用startThread()方法,判断当前线程是否有启动,没有则启动这个线程。

    1. netty是如何解决jdk空论的bug的

    netty通过计数的方式,如果阻塞了一个select操作,实际上并没有花这么长时间,那么有可能出发了一次空轮询的bug,默认情况下,这个现象达到512次,则重建一个Selector,把原Selector上面所有的key移交到新的。通过这种方式避免。

    1. netty如何保证异步串行无锁化?

    在所有外部线程调用NioEventLoopChannle的方法的时候,通过inEventLoop方法来判断当前线程是本NioEventLoop持有的线程(是否是外部线程),外部线程的话,则把所有操作封装成一个task,丢到taskQueue里面。而这个队列里的task将会在NioEventLoop执行的第三个阶段runAllTask()中挨个执行,保证串行无锁化。

    相关文章

      网友评论

        本文标题:netty源码分析(11)-NioEventLoop总结

        本文链接:https://www.haomeiwen.com/subject/hmdryqtx.html