为什么阅读线程不"run out"?



我试图理解一些关于java线程的事情,这是我非常不熟悉的。不幸的是,我的示例太大,无法运行代码,但我会尝试尽可能指定我的问题。

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

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

(取自服务器类的内部类。

服务器通过其 serversocketsaccept()方法在while(true)循环中等待客户端,每当客户端连接时,都会以上述运行方法作为"入口点"启动一个新的Thread

我不明白的是为什么会这样。到目前为止,我的理解是,应该不断侦听某些东西的Thread必须包含一个while(true)结构,否则它将完成它的运行方法,并且它将在没有返回的情况下完成("死"调用堆栈)。

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

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

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

在没有数据的情况下readLine()。它只在流结束时返回 null,在套接字的情况下,这意味着对等方已断开连接。

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

相关内容

最新更新