java - 具有内部类和最终变量的线程化 Java 服务器

标签 java sockets final anonymous-inner-class

我编写了以下代码来实现线程服务器:

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/

相关文章:

java - 如何在 Java 中将字符串添加到字符串数组?

Cygwin html 到浏览器

java - 在ArrayBlockingQueue中,为什么将final成员字段复制到本地final变量中?

java - TCP-服务器不会打印/接收来自远程客户端的数据

java - Android 在 onClickListener 中更改 TextView 需要最终声明吗?

java - 什么时候应该使用final关键字而不是枚举?

java - 如何使用对象映射器将 List<Entity> 转换为 List<DTO> 对象?

java - 是否可以有多个android :id/list?

java - ASN.1整数转普通整数

c++ - pop3多行问题