2009-07-15 24 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或多或少是标准配置。