尝试使用资源和ServerSockets

时间:2013-11-21 20:37:21

标签: java multithreading sockets try-catch serversocket

我正在阅读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的范围是什么?它可以在捕获的异常块中使用,还是在周围块的其他位置使用?如果没有,如何可靠地关闭插座?
  2. 在这种情况下套接字是如何关闭的?我假设此示例可以停止执行的唯一方法是强制结束进程,但在此之后开放套接字会发生什么?正在使用的端口是否不再可用于其他应用程序(甚至是同一应用程序)?
  3. new KKMultiServerThread会发生什么?一旦线程完成其工作,这个线程是否被垃圾收集器清理了?

1 个答案:

答案 0 :(得分:1)

  1. 您不需要关闭ServerSocket,这就是try(资源)/ catch成语的发明。它确保资源最终正确关闭和释放。有问题的资源是所谓的AutoCloseable

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

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