java - Socket 上的 BufferedReader.readLine() 是阻塞操作吗?

标签 java sockets stream observable

我正在尝试运行一个示例类,该类使用 Observer 接口(interface)和 Observable 子类来检查来自套接字的输入流何时不同于空字符串。这是代码(Observable 类):

@Override
public void run() {
    String input;
    while (true) {
        try {
            input = reader.readLine();
            if (input != null) {
                setChanged();
                notifyObservers(input);
            } else
                System.out.println("Nothing read from the stream");
        } catch (IOException e) {
        }
    }
}

因此,当条件 input != null 为 true 时,就会调用 update() 方法并将其输出到 stdout从套接字读取了什么。服务器每秒发送一个字符串,观察者以最大速度检查它(没有任何 sleep() 调用)。那么,从套接字拥有的流中读取数据时,BufferedReader.readLine() 到底做了什么?因为 else block 永远不会被执行。

最佳答案

BufferedReader.readLine()

A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached

只有当另一端关闭连接时,您才会得到null

如果你想实现一种忙等待策略,你可以使用非阻塞 NIO,但要注意这会 100% 使用一个 CPU。

关于java - Socket 上的 BufferedReader.readLine() 是阻塞操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32078437/

相关文章:

c# - 如何处理对同一个套接字的读取和写入

java - 从字符串中删除控制、隐藏、不需要的字符

javascript - Socket.IO 每次发送一个数组(...)

java - 解决gradle中的循环依赖

java - 无法使用 BufferedReader.readline() 从套接字读取

ios - “Tried connecting on an already connected socket”-Socket.IO-客户端-Swift

C++ 流如何为输入分配空间?

c# - 异步/等待竞争条件

java - 当检测到来电时,启动 Android 应用程序

java - 从 Java 打开命令提示符