我有一个带有while循环的代码示例,其中包含true。我认为这会永远运行,直到程序或类停止。但是,我很困惑,因为每次运行while循环时都会生成一个新的PrintWriter。我认为这将是一个问题。还创建了一个新线程。我是否错误地阅读了此代码。
public static void main (String[] args) {
new VerySimpleChatServer().go();
}
public void go() {
clientOutputStreams = new ArrayList();
try {
ServerSocket serverSock = new ServerSocket(5000);
while(true) {
Socket clientSocket = serverSock.accept();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println(“got a connection”);
}
} catch(Exception ex) {
ex.printStackTrace();
}
} // close go
它看起来好像只在新连接时运行,但代码的哪一部分证明了这一点。它看起来好像是不断创建新的编写器和新线程。
有人可以解释一下吗?
答案 0 :(得分:1)
每个循环都会创建一个新线程,因为它位于while循环中。
你有while(true)
所以除非你打破循环,否则它会永远持续下去。
现在要分解循环中实际发生的事情
Socket clientSocket = serverSock.accept();
服务器接受来自客户端的新连接。
`PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());`
使用新客户端输出流创建新的PrintWriter对象。请注意,这是为每个客户端完成的,因为客户端不会有相同的输出流。
clientOutputStreams.add(writer);
假设这只是您可以用来写入客户端的所有PrintWriters的列表。
Thread t = new Thread(new ClientHandler(clientSocket));
创建一个新的Thread对象,不确定ClientHandler中的内容,但它必须有一些run方法。
t.start();
线程已启动。服务器可以继续接受新连接。
我希望能回答你的问题。
答案 1 :(得分:1)
只有当套接字可用时才会创建编写器,因为serverSock.accept()
正在阻塞(当套接字在其队列中可用时返回)。
注意:此代码已损坏,可以轻松抛出OutOfMemoryError
,因为它不会限制创建的线程数,请考虑使用managed thread pool。