【发布时间】:2017-03-17 10:23:23
【问题描述】:
一段时间以来,我一直在研究 Java 中的流和套接字。每个人都说 read() 阻塞(尤其是在网络比我们的计算机慢得多的套接字中)。我试图想象这是如何工作的。我的意思是它看起来像:
(PSEUDOCODE)
read() {
while (true) {
if (there is at least one byte to read) {
return this byte;
}
}
}
或者它与其他低级的东西有关?我假设 Java 中的 Streams 是用 C/C++ 实现的。我的问题是,首先 read() 是如何工作的,其次我们的线程在阅读时是否会获得任何类型的“睡眠”?我的意思是一段时间(真)是对 CPU 周期的浪费,我想知道在 read() 上阻塞的线程是否被另一个线程通知“嘿,你的字节准备好了!”提前致谢。
【问题讨论】:
-
InputStream 类文档指定每个子类都为
read()方法提供自己的实现。如果您查看实现,您会发现通常会调用处理它的本机方法。我认为这与低级操作系统功能在处理此类操作时更有效的事实有关。 -
我认为使用
while(true){}的那种忙等待是非常低效的,并且应该有一个异步通知系统来在数据可用时发出信号。 -
线程未处于“睡眠”状态,它被阻塞等待 IO,只有在解除阻塞后才能再次调度。不会有旋转等待。所有这些都由(主要是本机)JVM 代码处理。