我试图理解一些关于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,在套接字的情况下,这意味着对等方已断开连接。
如果客户端不发送任何内容,则服务器套接字没有任何要读取的内容。当客户端写入套接字并发送内容时,读取器可以读取内容