为什么阅读线程没有“耗尽”?

时间:2017-03-11 15:25:55

标签: java multithreading stream

我正在尝试理解java中有关线程的一些内容,我对此并不熟悉。不幸的是,我的示例对于运行代码来说太大了,但我会尝试尽可能地指定我的问题。

两个相似代码段中的一个(取自一个简单的ChatClient / Server类的小例子),这是我的问题的核心:

public void run(){
    String message;
        try{
            while((message = reader.readLine()) != null){
                tellEveryone(message);
            }
        }catch(Exception ex){...}
}

(取自Server类的内部类。)

服务器正在通过其服务器套接字while(true)方法在客户端的accept()循环中等待,并且每当客户端连接时,以上述run方法作为“入口点”启动新的Thread

我不明白为什么会这样。直到现在我的理解是Thread应该经常听一些东西必须包含一个while(true)构造,否则它只会完成它的run方法而且它会在没有返回的情况下完成(“死”)调用堆栈。)

因此,对于我的例子,当读者向我们提供他在开始时必须提供的所有行时,我认为它将离开run() - 方法,当特定客户端发送新消息但似乎没有任何事情发生它一直在监听客户输入。这有什么作用?

(我可能应该说“reader”是内部类中的BufferedReader,它为每个连接的客户端实例化一次。)

我希望有充分的解释。如果需要更多信息,我很乐意提供。

2 个答案:

答案 0 :(得分:3)

没有数据时,

readLine() 阻止。它只在流的末尾返回null,在套接字的情况下意味着对等体已断开连接。

答案 1 :(得分:1)

如果客户端没有发送任何内容,则服务器套接字没有任何要读取的内容。当客户端写入套接字并发送内容时,阅读器可以读取内容