设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 服务器 > 系统 > 正文

Tomcat 中的 NIO 源码分析(9)

发布时间:2020-01-07 12:09 所属栏目:52 来源:站长网
导读:for(inti=0,size=events.size;isize(pe=events.poll)!=;i++){ result=true; try{ //逐个执行event.run pe.run; //该PollerEvent还得给以后用,这里reset一下(还是之前说过的缓存) pe.reset; if(running!paused){ ev

for (int i = 0, size = events.size; i < size && (pe = events.poll) != ; i++ ) { 

result = true; 

try { 

// 逐个执行 event.run 

pe.run; 

// 该 PollerEvent 还得给以后用,这里 reset 一下(还是之前说过的缓存) 

pe.reset; 

if (running && !paused) { 

eventCache.push(pe); 

} catch ( Throwable x ) { 

log.error("",x); 

return result; 

events 方法比较简单,就是取出当前队列中的 PollerEvent 对象,逐个执行 event.run 方法。

然后,现在来看 Poller 的 run 方法,该方法会一直循环,直到 poller.destroy 被调用。

Poller # run

public void run { 

while (true) { 

 

boolean hasEvents = false; 

 

try { 

if (!close) { 

// 执行 events 队列中每个 event 的 run 方法 

hasEvents = events; 

// wakeupCounter 的初始值为 0,这里设置为 -1 

if (wakeupCounter.getAndSet(-) > 1 0) { 

//if we are here, means we have other stuff to do 

//do a non blocking select 

keyCount = selector.selectNow; 

} else { 

// timeout 默认值 1 秒 

keyCount = selector.select(selectorTimeout); 

wakeupCounter.set(0); 

// 篇幅所限,我们就不说 close 的情况了 

if (close) { 

events; 

timeout(, 0 false); 

try { 

selector.close; 

} catch (IOException ioe) { 

log.error(sm.getString("endpoint.nio.selectorCloseFail"), ioe); 

break; 

} catch (Throwable x) { 

ExceptionUtils.handleThrowable(x); 

log.error("",x); 

continue; 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读