我编写了以下代码来实现线程服务器:
ServerSocket passiveSocket = new ServerSocket(port, maxConnections);
while(true){
final Socket socket = passiveSocket.accept();
new Thread(new Runnable() {
public void run() {
//access socket as needed to communicate. E.g.:
PrintWriter writer = new PrintWriter(socket.getOutputStream());
//Finally close socket.
socket.close();
}
}).start();
}
现在这似乎可行,但经过反射(reflection),我并不真正理解当下一个连接到达时最终套接字变量 socket 发生了什么。每个线程如何与启动线程时当前的套接字实例关联? - final 关键字是造成这种情况的原因吗?
最佳答案
这样想:socket
作为参数 secret 传递给 new Runnable
构造函数,并作为变量保存在匿名 Runnable< 中
类。 (这实际上是字节码级别的工作原理。)
创建的 Runnable
对象在创建时包含对一个特定 Socket
值的引用,因此它可以在完成后关闭该特定套接字。
关于java - 具有内部类和最终变量的线程化 Java 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10195098/