Java 为什么阅读线索不是;用完;?

Java 为什么阅读线索不是;用完;?,java,multithreading,stream,Java,Multithreading,Stream,我试图理解一些关于java中线程的东西,这是我非常不熟悉的。不幸的是,我的示例太大,无法运行代码,但我将尽可能详细说明我的问题 两个类似的代码段之一(取自一个简单的ChatClient/Server类示例),这是我问题的中心: public void run(){ String message; try{ while((message = reader.readLine()) != null){ tellEveryo

我试图理解一些关于java中线程的东西,这是我非常不熟悉的。不幸的是,我的示例太大,无法运行代码,但我将尽可能详细说明我的问题

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

public void run(){
    String message;
        try{
            while((message = reader.readLine()) != null){
                tellEveryone(message);
            }
        }catch(Exception ex){...}
}
(取自服务器类的内部类。)

服务器通过其serversockets
accept()
方法在
while(true)
循环中等待客户端,每当客户端连接时,一个新的
线程将以上述运行方法作为“入口点”启动

我不明白的是为什么这样做。到目前为止,我的理解是
Thread
应该持续侦听某些内容,它必须包含
while(true)
构造,因为否则它只会完成其run方法,并且不会返回(“死”调用堆栈)

因此,在我的示例中,当reader在开始时给了我们他必须给出的所有行时,我认为它将离开
run()
-方法,并且当特定的客户端发送新消息时不会发生任何事情,但它似乎一直在侦听客户端输入。这是怎么回事

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


我希望这已得到充分解释。如果需要更多信息,我将很乐意提供。

如果客户端不发送任何内容,则服务器套接字没有任何内容可读取。当客户端写入套接字并发送内容时,读卡器可以在没有数据的情况下读取内容块。它只在流结束时返回null,对于套接字,这意味着对等方已断开连接。

谢谢您的回答,这为我解决了这个问题!我没有意识到这种行为;我认为这和从文本文件(我测试过)读取一样,这就是为什么我希望得到一个空值。这没什么不同。也许你认为当发送者停止发送时,你会得到一个空值,然后当他再次发送时,你会得到一个非空值?是的,或多或少是这样;特别是第一点是我想的,;至少当我们将“停止发送”定义为“不再有可从客户端读取的行”时。当您说“对等方已断开连接”时,您的意思是服务器在客户端套接字中有空引用吗?