1

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

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

相关问题:当​​方法被描述为阻塞时,是否暗示线程在等待时让步?还是没有合同/保证?在我看来,一种不断检查/轮询数据的方法仍然会阻塞。

4

4 回答 4

3

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

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

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

于 2009-07-15T23:03:05.047 回答
1

有一定数量的循环被阻塞占用。有线程开关。与缓存充满无用数据相关的问题。可能在多线程机器上,如果线程可以在没有上下文切换的情况下快速解除阻塞,则会有一小段时间旋转。

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

于 2009-07-15T23:44:49.690 回答
1

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

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

于 2009-07-15T23:03:02.053 回答
0

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

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

于 2009-07-28T01:38:52.663 回答