2012-04-17 24 views
1

我正在研究NioWorker.run()方法並試圖瞭解它是如何工作的。 下面是代碼的簡化版本:Netty體系結構 - 有關NioWorker循環的問題

for(;;) {   
     try { 
     SelectorUtil.select(selector); 

     if (wakenUp.get()) { 
      selector.wakeup(); 
     } 

     cancelledKeys = 0; 
     processRegisterTaskQueue(); 
     processWriteTaskQueue(); 
     processSelectedKeys(selector.selectedKeys()); 

     } catch (Throwable t) { 
     } 
    } 

更少很清楚但它做什麼,我有一些問題:

Selector.select(選擇)執行與500的選擇毫秒超時。 爲什麼它不僅僅是一個阻塞呼叫?

2.以下片段的目的是什麼?爲什麼我們需要執行喚醒?

if (wakenUp.get()) { 
     selector.wakeup(); 
    } 

在此先感謝

回答

2
  1. 我們使用基於時間的阻塞Selector.select(..)調用,因爲我們也通過processRegisterTaskQueue處理的新渠道,工人的登記()方法。如果我們不會使用基於時間的電話,我們會面臨放慢速度的風險。我們甚至將Selector.select(..)調用改爲在最近的版本中使用10ms。

  2. 見註釋[1]

[1] https://github.com/netty/netty/blob/3/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java#L202

+0

1.按我的理解阻斷選擇器將在情況下,新的連接到達解鎖,所以你不必有基於時間的調用使processRegisterTaskQueue調用。 2.附件中的註釋僅討論wakenUp.get()。我想了解爲什麼選擇器必須被喚醒的原因?是否有多個線程與選擇器一起工作? – 2012-04-17 21:48:04

+0

在boss線程上使用一個單獨的選擇器接受IO-Worker用於處理連接的選擇器的新連接。從老闆選擇器到IO-Worker選擇器的切換由老闆線程放置任務來處理,以便將隊列中的IO-Worker註冊爲新通道,然後由IO-Worker處理。 IO-Worker必須被喚醒來處理隊列。 – johnstlr 2012-04-18 08:25:22