2012-04-02 45 views
2

比方說,我有一些UDP通道和一些TCP通道註冊到我的選擇器。一旦選擇器被喚醒,我可以不停地循環和讀取儘可能多的信息,而不必循環回去並執行另一個選擇()。對於TCP來說,這並沒有多大意義,因爲我可以通過調用channel.read()儘可能多地讀入我的ByteBuffer,但對於UDP,只能通過調用channel.receive()來一次讀取一個數據包。 。那麼我讀了多少包?你是否看到一個問題,只是繼續閱讀(不只是閱讀,而是寫作,連接和接受,換句話說,所有的關鍵操作),直到沒有別的事情做,然後我再次執行選擇?這樣一個UDP通道不會讓其​​他通道捱餓。您將盡可能多地處理所有通道,從UDP通道一次讀取一個數據包。我特別關心的是:一旦選擇器返回,我可以從頻道讀取多長時間和多長時間?

1)如果我可以在沒有它的情況下繼續處理我的密鑰,那麼性能會受到太多選擇的影響。

2)select()做了什麼基本的事情,我不能繞過以保持讀/寫/接受/連接?

再一次,請記住,我將處理所有按鍵,而不僅僅是所選的按鍵。如果沒有任何關鍵(沒有數據),我什麼都不做,繼續下一個關鍵。

回答

3

我認爲你必須嘗試兩種方式。你可以構建一個合理的論點,說你應該閱讀每個可讀通道,直到read()返回零,或者你應該爲每個通道處理一個事件並且每次只做一個事件。我可能會喜歡第一個,但我可以記得當我沒有。

再次,請記住,我將處理所有鍵,而不僅僅是 所選的鍵。

爲什麼?您應該處理選定通道上的事件,然後您可能希望對未選擇的通道執行超時處理。我不會混淆這兩件事情,它們完全不同。不要忘記以任何方式從selectedKeys集中刪除密鑰。

+2

我想我必須循環所有的鍵,因爲在此期間一些非選定的鍵可能會被選中,你知道我的意思嗎? (如數據可能會到達一個沒有被選中的鍵)所以我需要將它們包含在我的「外部選擇器」循環中。不通過selector.select()方法循環看起來很奇怪,但它似乎更快。我只是想知道,不調用select會實際導致網絡級別的任何問題。 – JohnPristine 2012-04-02 23:55:10

+1

@JohnPristine它所要做的只是讓你自旋鎖定CPU,除非當你有一個沒有I/O的循環迭代時最終調用它。 – EJP 2012-04-03 00:02:59

+0

是的,如果你讀了一些東西,只會再次循環。否則,請轉到selector.select()。 – JohnPristine 2012-04-03 00:04:41

相關問題