簡體   English   中英

使用Java NIO進行並發連接

[英]concurrent connection using Java NIO

問題的總體輪廓是帶有多線程的ClientSocketChannel使用的CPU超出了預期。 一般的事情是帶有多線程的ClientSocketChannel。 好的,我應該說這個問題之前我要問的問題

還有其他帖子具有相同的答案。 我再次提到它的原因是我真的無法理解答案,因為答案不明顯,也無法采用我的代碼。 我嘗試簡要解釋需求,以查看是否有一個可以涵蓋整個需求的答案。

  1. 寫過程應使用填充另一個線程的字節緩沖區觸發
  2. 系統必須意識到寫入或讀取操作,因為任何操作都可能首先發生。
  3. 防止不必要的cpu​​運行的方法,這似乎使OP_write在不需要時變得很忙。

回答:

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM