唤醒了阻塞的slct,你还记得阻塞后的逻辑么?
唤醒后会根据nioSlctor.slct()返回的adKys这个int数字,如果大于0如执行pollSlctionKys的一些操作,由于直接被wakUp(),实际adKys是0,所以poll方法直接就返回了,不会执行pollSlctionKys的处理。
而且Slctor的poll方法返回后,由于pollSlctionKys没有执行,所以之后一系列方法handlCompltdSnds、handlCompltdRcivs、handlDisconnctions、handlConnctions、handlTimdOutRqusts均没有执行。(你可以自己尝试断点下,就会发现。)
上面的逻辑执行完成,也就说第一次循环会结束,重新进行第二次循环。整体过程如下图所示:(主要执行了灰色的备注标注的流程)
文章配图第二次循环maybUpdat执行的原因
既然进入第二次循环,就会重新执行将重新执行maybUpdat()、poll()、handl开头的这些方法。
你还记得maybUpdat的核心脉络么?它主要是根据3个时间决定了mtadataTimout是否为0,来决定是否执行。代码如下:
OvrridpubliclongmaybUpdat(longnow){//shouldwupdatourmtadata?longtimToNxtMtadataUpdat=mtadata.timToNxtUpdat(now);longtimToNxtRconnctAttmpt=Math.max(this.lastNoNodAvailablMs+mtadata.fshBackoff()-now,0);longwaitForMtadataFtch=this.mtadataFtchInProgss?Intgr.MAX_VALUE:0;//ifthisnonodavailabltoconnct,backofffshingmtadatalongmtadataTimout=Math.max(Math.max(timToNxtMtadataUpdat,timToNxtRconnctAttmpt),waitForMtadataFtch);if(mtadataTimout==0){//Bwathatthbhaviorofthismthodandth