比方說,我有一些UDP通道和一些TCP通道註冊到我的選擇器。一旦選擇器被喚醒,我可以不停地循環和讀取儘可能多的信息,而不必循環回去並執行另一個選擇()。對於TCP來說,這並沒有多大意義,因爲我可以通過調用channel.read()儘可能多地讀入我的ByteBuffer,但對於UDP,只能通過調用channel.receive()來一次讀取一個數據包。 。那麼我讀了多少包?你是否看到一個問題,只是繼續閱讀(不只是閱讀,而是寫作,連接和接受,換句話說,所有的關鍵操作),直到沒有別的事情做,然後我再次執行選擇?這樣一個UDP通道不會讓其他通道捱餓。您將盡可能多地處理所有通道,從UDP通道一次讀取一個數據包。我特別關心的是:一旦選擇器返回,我可以從頻道讀取多長時間和多長時間?
1)如果我可以在沒有它的情況下繼續處理我的密鑰,那麼性能會受到太多選擇的影響。
2)select()做了什麼基本的事情,我不能繞過以保持讀/寫/接受/連接?
再一次,請記住,我將處理所有按鍵,而不僅僅是所選的按鍵。如果沒有任何關鍵(沒有數據),我什麼都不做,繼續下一個關鍵。
我想我必須循環所有的鍵,因爲在此期間一些非選定的鍵可能會被選中,你知道我的意思嗎? (如數據可能會到達一個沒有被選中的鍵)所以我需要將它們包含在我的「外部選擇器」循環中。不通過selector.select()方法循環看起來很奇怪,但它似乎更快。我只是想知道,不調用select會實際導致網絡級別的任何問題。 – JohnPristine 2012-04-02 23:55:10
@JohnPristine它所要做的只是讓你自旋鎖定CPU,除非當你有一個沒有I/O的循環迭代時最終調用它。 – EJP 2012-04-03 00:02:59
是的,如果你讀了一些東西,只會再次循環。否則,請轉到selector.select()。 – JohnPristine 2012-04-03 00:04:41