gpt4 book ai didi

java - Blocking IO 到底什么时候阻塞?

转载 作者:行者123 更新时间:2023-12-02 10:00:29 26 4
gpt4 key购买 nike

InputStream.available() javadoc:

Returns the number of bytes that can be read (or skipped over) from this input stream without blocking

  1. 我认为阻塞意味着我调用 read() 的线程被阻塞(控制流不会进一步进行),直到 read()返回。从这个意义上说,我看不到任何可以在不阻塞的情况下调用 read() 的场景。

  2. 阻塞的另一个含义可能是,如果我想读取 3 个字节,但没有或只有 1 个字节可用,read() 将阻塞并等待更多字节出现 - 但是我无法这样理解 b/c 然后调用 read() 并尝试读取超出可用的内容可能会导致永久阻塞(只是想象从 10 字节的文件中读取 100 字节)。

在哪种意义上 java.io 正在阻塞(1)或(2)?

我无法模拟使用FileInputStream或ByteArrayInputStream读取IO block (意义(2))的方法时的情况:

        // file content is: 1 2 3       
FileInputStream myStream = new FileInputStream("d:\\file.txt");
byte[] b = new byte[100];
myStream.read(b);
System.out.println("control reached here?");
System.out.println(Arrays.toString(b));

输出:

reached here?
[122, 100, 122, 120, 118, 122, 120, 32, 118, 122, 120, 118, 32, 122, 120, 118, 32, 122, 118, 99, 122, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

第二次调用 myStream.read(b) 也只会返回 -1 而不会阻塞。

什么情况下会发生阻塞?

我认为如果我尝试读取 5 个字节,结果是三个字节,就会发生这种情况。如果没有,则意味着 EOF/流结束,并返回 -1(也不阻塞)。

附注我倾向于认为 java.io 既是 (1) 又是 (2):它是同步的 (1) 和阻塞的 (2),但只有在使用套接字时才真正观察到阻塞 (Socket.getInputStream()/Socket.getOutputStream())。

最佳答案

或多或少是选项 2,但即使已经有一些数据需要处理,您也不必担心 read 阻塞。

这里有一个提示:不要使用 available()。它实际上是无用的,它提供的信息并不能真正让你做你本来无法做的事情。

假设您有 TCP 网络连接。在您或对方挂断连接之前,可以通过线路发送多少字节是没有限制的,但另一方面,可能还有 10 个字节需要读取,并且不会再有更多字节了有一段时间,因为发件人目前保持沉默。

假设您这样做:

byte[] b = new byte[100];
int r = in.read(b);

这里会发生什么,r 将是 10b 中的前 10 个槽将被填充,这就是那。 read 'smartly' 返回:如果有 0 个字节,它不会返回(read 保证它会阻塞,直到它读取至少 1 个字节,或者流被关闭,在这种情况下它返回-1)...如果有字节要读取,它会读取其中的有效 block 。

具体来说,

阻塞意味着线程将暂停,并且在发生更改之前不会恢复。 (字节进来,或者流被关闭)。

关于java - Blocking IO 到底什么时候阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55669555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com