繁体   English   中英

尝试资源和ServerSockets

[英]Try-with-resources and ServerSockets

我在http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html上阅读了KnockKnock服务器示例,发现了一些我有一些疑问的代码。

try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
    while (listening) {
        new KKMultiServerThread(serverSocket.accept()).start();
    }
} catch (IOException e) {
    System.err.println("Could not listen on port " + portNumber);
    System.exit(-1);
}

我的问题:

  1. serverSocket的范围是serverSocket 它可以在捕获的异常块中还是在周围的块中其他地方使用? 如果没有,如何可靠地关闭插座?
  2. 在这种情况下,插座如何关闭? 我认为该示例可以停止执行的唯一方法是强制结束进程,但是此后打开的套接字会发生什么情况? 使用中的端口是否不再对其他应用程序(甚至同一应用程序)可用?
  3. new KKMultiServerThread会发生什么? 线程完成工作后,该线程是否由垃圾收集器清除?
  1. 您不需要关闭ServerSocket,这就是发明了try(resource)/ catch惯用语的目的。 它可以确保最后正确关闭和释放资源。 有问题的资源是所谓的AutoCloseable

  2. 与Java保留的所有内存一样,一旦不再使用它,最终将由GC对其进行清理。 但是,只有在此类线程的run()方法完成后才能发生这种情况。 此外,只有在所有其余线程都是守护程序线程时,JVM才会终止,因此,如果那些KKMultiServerThreads是标准(非守护程序)线程,则即使在上述循环完成之后,JVM也可能会持续存在,直到至少完成所有线程。

他们终止上述循环的正确方法是将listening设置为false,然后在接受线程上调用interrupt() 在这种情况下,accept()方法将返回并立即跳转到异常处理,然后try(资源)/ catch(更像是try / catch / finally close())将确保服务器正确关闭。 这还将释放其他程序正在使用的端口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM