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

苏州网站建设集团国际教育机构网站建设开发方案

苏州网站建设集团,国际教育机构网站建设开发方案,绿色风格 网站,自己制作头像的网站 设计 动漫1.入口 会调用到父类SingleThreadEventLoop的构造方法 2.SingleThreadEventLoop 继续调用父类SingleThreadEventExecutor的构造方法 3.SingleThreadEventExecutor 到这里完整的总结一下#xff1a; 将线程执行器保存到每一个SingleThreadEventExcutor里面去创建了MpscQu… 1.入口 会调用到父类SingleThreadEventLoop的构造方法 2.SingleThreadEventLoop 继续调用父类SingleThreadEventExecutor的构造方法 3.SingleThreadEventExecutor 到这里完整的总结一下 将线程执行器保存到每一个SingleThreadEventExcutor里面去创建了MpscQueue具体为什么因为在NioEventLoop里面重写了newTaskQueue方法 等父类调用完毕最后回到NioEventLoop里面最重要的一件事创建Selector 最后那一张图完整的总结一下 4.NioEventLoop.run 4.1 调用入口 这里还是要回顾一下这个方法是什么时候调用的Netty在启动的时候在调用config().group().register(channel) 使用bossGroup做channel注册的时候它会使用EventExecutorChooser找一个NioEventLoop然后去做注册最终会调用到这个abstractChannel.register方法一般来说我们启动的时候运行到这里eventLoop会返回false所以会调用到eventLoop.execute里面的方法在这里我们就能找到这个NioEventLoop.run的调用地方也就说在使用NioEventLoop将channel注册到selector的时候会判断是不是eventloop线程调用如果不是就会使用SingleThreadEventExecutor.execute执行它会将NioEventLoop.run方法包装成一个runnable然后创建一个线程并启动然后就调用到NioEventLoop里面了 4.2 run方法 /*** todo select() 检查是否有IO事件* todo ProcessorSelectedKeys() 处理IO事件* todo RunAllTask() 处理异步任务队列*/ Override protected void run() {for (; ; ) {try {// todo hasTasks() true代表 任务队列存在任务switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {case SelectStrategy.CONTINUE:continue;case SelectStrategy.SELECT:// todo 轮询IO事件, 等待事件的发生, 本方法下面的代码是处理接受到的感性趣的事件, 进入查看本方法select(wakenUp.getAndSet(false));// wakenUp.compareAndSet(false, true) is always evaluated// before calling selector.wakeup() to reduce the wake-up// overhead. (Selector.wakeup() is an expensive operation.)//// However, there is a race condition in this approach.// The race condition is triggered when wakenUp is set to// true too early.//// wakenUp is set to true too early if:// 1) Selector is waken up between wakenUp.set(false) and// selector.select(...). (BAD)// 2) Selector is waken up between selector.select(...) and// if (wakenUp.get()) { ... }. (OK)//// In the first case, wakenUp is set to true and the// following selector.select(...) will wake up immediately.// Until wakenUp is set to false again in the next round,// wakenUp.compareAndSet(false, true) will fail, and therefore// any attempt to wake up the Selector will fail, too, causing// the following selector.select(...) call to block// unnecessarily.//// To fix this problem, we wake up the selector again if wakenUp// is true immediately after selector.select(...).// It is inefficient in that it wakes up the selector for both// the first case (BAD - wake-up required) and the second case// (OK - no wake-up required).if (wakenUp.get()) {selector.wakeup();}// fall throughdefault:}cancelledKeys 0;needsToSelectAgain false;final int ioRatio this.ioRatio; // todo 默认50// todo 如果ioRatio100 就调用第一个 processSelectedKeys(); 否则就调用第二个if (ioRatio 100) {try {// todo 处理 处理发生的感性趣的事件processSelectedKeys();} finally {// Ensure we always run tasks.// todo 用于处理 本 eventLoop外的线程 扔到taskQueue中的任务runAllTasks();}} else {// todo 因为ioRatio默认是50 , 所以来else// todo 记录下开始的时间final long ioStartTime System.nanoTime();try {// todo 处理IO事件processSelectedKeys();} finally {// Ensure we always run tasks.// todo 根据处理IO事件耗时 ,控制 下面的runAllTasks执行任务不能超过 ioTime 时间final long ioTime System.nanoTime() - ioStartTime;// todo 这里面有聚合任务的逻辑runAllTasks(ioTime * (100 - ioRatio) / ioRatio);}}} catch (Throwable t) {handleLoopException(t);}// Always handle shutdown even if the loop processing threw an exception.try {if (isShuttingDown()) {closeAll();if (confirmShutdown()) {return;}}} catch (Throwable t) {handleLoopException(t);}}} 这里注释其实说得挺清楚最后总结一下 select(wakenUp.getAndSet(false))轮训io事件发生当timeout或者有事件会breakprocessSelectedKeys处理io事件运行taskQueue里面的任务 4.3 processSelectedKeys 在真正执行的时候最终会走到processSelectedKeysOptimizednetty对底层selectKeys容器进行过优化用数组代替了keyset 这里我为了debug使用telnet localhost 8899, 接着就会进入到processSelectedKeysOptimized中在走进processSelectedKey方法之后最终会走到unsafe.read方法 5.AbstractNioMessageChannel 接着会调用到子类NioServerSocketChannel的doReadMessage(readBuf), 调用完子类之后会通过pipline.fireChannelRead, 意思就是对于server端来说可读了但是注意这时候传的是子类中创建的NioSocketChannel说白了给server端一个NioSocketChannel就是要创建新连接了。最终会调用到ServerBootstrapAcceptor的ChannelRead具体看后面的ServerBootStrapAcceptor类 6.NioServerSocketChannel 这里主要做了几件事 SocketUtils.accpet接受连接并创建jdk底层的socketChannelnew NioSocketChannel将jdk封装成NioSocketChannel这里和创建NioServerSocketChannel的时候一样不断的调用父类同时创建NioServerChannel的pipline这里注意这里会设置感兴趣的事件为read 7.ServerBootstrap#ServerBootstrapAcceptor ServerBootstrapAcceptor是ServerBootstrap的内部类之前AbstractNioMessageChannel里面的最终会调用到ServerBootstrapAcceptor的channelRead方法简单的总结一下做了几件事 给sockeChannel也是这里的child设置childHandler使用childGroup.register 来完成socketChannel到Selector的注册这里和SocketServerChannel到Selector的注册逻辑是一样的都是从EventLoopGroup中选一个EventLoop里面有Selector然后调用jdk的registereventloop.getSelector, 0, NioSocketChannel(netty对于socketChannel的包装) 8.AbstractChannel childGroup.register - MultithreadEventLoopGroup.register - SingleThreadEventLoop.register - AbstractChannel.registerAbstractChannel.abstractUnsafe.register 这一刻代码之前都讲过就是把创建socketChannel注册到EventLoop上的Selector上去AbstractChannel.register0(): doRegister: 完成了SocketChannel到Selector的注册pipeline.invokeHandlerAddedIfNeeded: 这里会调用之前我们设置MyServerInitializer.initChannel(), 会往SocketChannel的pipeline中加入一系列读写用到的Handler 9.总结 最后那一张图总结一下
http://www.dnsts.com.cn/news/138390.html

相关文章:

  • 咨询服务网站源码爱客crm登陆
  • 安阳网站建设服务路由器做网站服务器
  • 上海平台网站建设公云建站网址
  • 咸阳企业网站建设网站设计师发展方向
  • 网站设计的优点河北网站制作 网站开发
  • 小榄公司网站建设wordpress修改logo地址
  • 作网站清理优化大师
  • 求手机网站天津公司网站制作
  • 兰州seo新站优化招商天津网站建设学习
  • 双语网站后台怎么做建设网站对公司起什么作用
  • 个人可以做医疗信息网站吗做站群的网站怎么来
  • 技术支持 桂林网站建设重庆的网站设计公司
  • 承德网站开发公司wordpress增加中英文切换
  • 网站建设选哪家上海网页设计公司山东济南兴田德润简介
  • 网上银行登录入口温州快速排名优化
  • wordpress 做分销公司网站关键词优化怎么做
  • 中山建设厅网站首页线上注册公司流程和费用
  • 企业信息查询单在哪打印沧州做网站优化
  • 济南天桥区网站建设公司甘肃城乡建设局安全质量网站
  • 贵阳市住房和城乡建设厅网站自助贸易免费建站
  • 自己做发卡网站长安庆市住房和建设厅网站
  • 婚庆网站建设必要性免费背景图片素材网
  • 做网站是什么专业建设一个网站的所有代码
  • 化妆品网站优势个人做网站需要多少钱
  • php网站开发预算文档4399网站开发人员 被挖走
  • 南昌网站建设渠道永久免费的网站地址
  • 做flash网站目前网站开发应用到的技术有什么
  • 企业网站推广过程qq邮箱登陆 com登录
  • 手机网站自适应屏幕营销型网站建设易网拓
  • 无锡网站制作有哪些中小型企业网站模板