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();
}
在此先感謝
1.按我的理解阻斷選擇器將在情況下,新的連接到達解鎖,所以你不必有基於時間的調用使processRegisterTaskQueue調用。 2.附件中的註釋僅討論wakenUp.get()。我想了解爲什麼選擇器必須被喚醒的原因?是否有多個線程與選擇器一起工作? – 2012-04-17 21:48:04
在boss線程上使用一個單獨的選擇器接受IO-Worker用於處理連接的選擇器的新連接。從老闆選擇器到IO-Worker選擇器的切換由老闆線程放置任務來處理,以便將隊列中的IO-Worker註冊爲新通道,然後由IO-Worker處理。 IO-Worker必須被喚醒來處理隊列。 – johnstlr 2012-04-18 08:25:22