2009-07-15 50 views
1

如果我調用DataInputStream的read(),它會佔用CPU週期等待數據還是產生當前線程,並通過中斷信號喚醒數據已到達?java:d​​atainputstream:讀等待數據時讀取調用佔用處理器時間嗎?

我的動機是確定流讀取器是否需要在自己的線程中。阻塞讀取佔用CPU時間並不理想,因爲這會掛起主線程。

相關問題:當​​一個方法被描述爲一個阻塞時,它是否意味着線程在等待時產生?還是沒有合同/保證?不斷檢查/輪詢數據的方法仍然阻塞,這聽起來,對我來說。

回答

1

它不佔用CPU週期,但是被阻塞,沒有別的東西會被執行。

如果可以,請使用Java的NIO,它是非阻塞的。否則,有一個單獨的線程可能是理想的。

3

通常,I/O將導致讀取線程阻塞,直到數據可用,並且其他線程可以自由運行。當數據到達時,閱讀器被解鎖。

阻塞意味着被阻塞的線程等待被解除阻塞,而其他線程運行。你不需要通常會發現(在設計良好的代碼中 - 而不是在Java運行時)繁忙等待代碼,它在輪詢數據時循環。

在另一方面,我看到只是在代碼中的一切,我已經不得不接管:-(

1

有由阻斷佔用週期一定的數量。還有就是線程切換相關的問題有可能是在多線程機器上有短時間的旋轉,以防線程在沒有上下文切換的情況下可以快速解除阻塞

所以,有一點點如果你看到任何特定的性能問題,地址那些。對於I/O操作,I/O性能可能比CPU性能更重要。

0

從線程的角度來看,你很好(根據其他答案) - 在阻塞中沒有/最少的CPU使用。然而,不要期望高I/O性能 - 因爲InputStream讀取方法是同步的,阻塞的,並且對每個字節執行安全檢查,所以它們相當慢。 如果您正在讀取批量數據,請一次查看NIO或讀取大字節[]。 1K-8K或多或少是標準配置。