我在寫一個非阻塞客戶端,它使用選擇器SelectionKey.OP_READ
和selector.select()
調用從網絡套接字讀取數據。閱讀部分是這樣處理的:Java NIO套接字IO退化讀取塊大小
if (selectionKey.isReadable()) {
int len = inChannel.read(buf);
System.out.println(len);
. . .
}
我看到的是,讀取大小(len
)作爲下載逐漸退化問題的進展:
1290
1290
1290
480
318
28
28
28
28
28
28
28
28
28
28
28
28
28
有誰知道這是爲什麼,以及如何改善它?當然,它的工作原理是這樣,但我需要減少CPU開銷,因此最好處理大塊而不是小塊。增加一個小的睡眠(20ms)會有所幫助,但顯然會限制可擴展性,因爲我需要同時處理數千個數據流。
我認爲你應該重新考慮你想要做的事情。非阻塞式讀取意味着「給我你現在有的數據,並儘快返回」。等待獲取更多數據的非阻塞讀取實際上是一個阻塞讀取,不是嗎?該過程在等待數據時應該做些什麼? – Flavio 2012-07-11 08:46:03