java:d​​atainputstream:读取调用会在等待数据时占用处理器时间吗?

时间:2009-07-15 22:53:43

标签: java inputstream cpu

如果我在DataInputStream上调用read(),它会占用等待数据的CPU周期,还是会产生当前线程并被数据到达的中断信号唤醒?

我的动机是确定流阅读器是否需要在自己的线程中。占用CPU时间的阻塞读取并不理想,因为这会挂起主线程。

相关问题:当​​一个方法被描述为阻塞时,它是否意味着线程在等待时产生?或者没有合同/保证?听起来,一种持续检查/轮询数据的方法仍会阻止我。

4 个答案:

答案 0 :(得分:3)

通常,I / O会导致读取线程阻塞,直到数据可用,其他线程可以自由运行。当数据到达时,读取器将被解锁。

阻塞意味​​着阻塞的线程等待解除阻塞,而其他线程运行。您通常会找到(在设计良好的代码中 - 而不是在Java运行时中)繁忙等待的代码,该代码在轮询数据时循环。

另一方面,我已经看到了我必须接管的代码中的所有内容: - (

答案 1 :(得分:1)

它不占用CPU周期,但是,阻塞,也没有其他任何东西被执行。

如果可以的话,使用Java的NIO,它是非阻塞的。否则,拥有一个单独的线程可能是理想的。

答案 2 :(得分:1)

阻塞会占用一定数量的周期。有线程开关。缓存充满无用数据的相关问题。可能,在多线程机器上,如果没有上下文切换,线程可以快速解除阻塞,则可以进行短时间的旋转。

所以,有一点点开销。但是,一旦这样做不成问题就不应该成为问题。您使用DataInputStream的事实既不在这里也不在那里。如果您发现任何特定性能问题,请解决这些问题。对于I / O操作,I / O性能可能比CPU性能更重要。

答案 3 :(得分:0)

从线程的角度来看你很好(根据其他答案) - 在阻塞中没有/最少的CPU使用。

但是,不要期望高I / O性能 - 因为InputStream读取方法是同步的,阻塞的,并且对每个字节执行安全检查它们非常慢。 如果您正在读取批量数据,请一次查看NIO或读取大字节[]。 1K-8K或多或少是标准的。