[英]concurrent connection using Java NIO
問題的總體輪廓是帶有多線程的ClientSocketChannel使用的CPU超出了預期。 一般的事情是帶有多線程的ClientSocketChannel。 好的,我應該說這個問題之前我要問的問題 。
還有其他帖子具有相同的答案。 我再次提到它的原因是我真的無法理解答案,因為答案不明顯,也無法采用我的代碼。 我嘗試簡要解釋需求,以查看是否有一個可以涵蓋整個需求的答案。
回答:
使用OP_WRITE的正確方法如下:
為OP_READ僅注冊新接受的頻道
那么,我們是否只需要一個具有OP_READ操作數的通道或兩個通道(channel1 OP_READ,channel2 OP_READ | OP_WRITE)?
當您有東西要寫入通道時,只需將其寫入
在代碼的哪一部分?
如果該寫入返回零,則為OP_WRITE注冊該通道,保存您嘗試寫入的ByteBuffer,然后返回到選擇循環。當OP_WRITE在該通道上觸發時,如果寫入成功但沒有成功,則使用相同的緩沖區調用write()返回零,再次注冊OP_READ,或至少從interestOps中刪除OP_WRITE。
據我所知,“如果該寫入返回零”,則意味着沒有字節要寫入,那么為什么要注冊OP_WRITE?
“保存字節緩沖區”:將這個緩沖區作為寄存器的第三個參數是否正確? 像下面的東西?
channel.register(selector, operations, SharedBuffer);
寫過程應使用填充另一個線程的字節緩沖區觸發
為什么? 另一個線程可以執行實際的寫操作。 您不需要“觸發”任何東西。
系統必須意識到寫入或讀取操作,因為任何操作都可能首先發生。
沒問題。
防止不必要的cpu運行的方法,這似乎使OP_write在不需要時變得很忙。
正確。 OP_WRITE幾乎總是准備就緒,因此當您沒有待寫入的未完成數據已失敗時使用它會浪費CPU。
那么,我們是否只需要一個具有OP_READ操作數的通道或兩個通道(channel1 OP_READ,channel2 OP_READ | OP_WRITE)?
您只需要一個頻道。
在代碼的哪一部分?
在知道它的部分中有東西要寫。
據我所知,“如果該寫入返回零”,則意味着沒有字節要寫入,
不,不是。 請參閱Javadoc。 這意味着什么也沒寫 。 如果沒有“要寫入的字節”,那么您將不會首先調用write()
。
那為什么要注冊OP_WRITE?
這樣一來,您就可以得知頻道何時可寫。
“保存字節緩沖區”:將這個緩沖區作為寄存器的第三個參數是否正確? 像下面的東西?
是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.