我正在阅读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);
}
我的问题:
serverSocket
的范围是什么?它可以在捕获的异常块中使用,还是在周围块的其他位置使用?如果没有,如何可靠地关闭插座?new KKMultiServerThread
会发生什么?一旦线程完成其工作,这个线程是否被垃圾收集器清理了?答案 0 :(得分:1)
您不需要关闭ServerSocket,这就是try(资源)/ catch成语的发明。它确保资源最终正确关闭和释放。有问题的资源是所谓的AutoCloseable。
与Java中保留的所有内存一样,一旦GC不再使用,它最终将被GC清理。但是,只有在此类线程的run()方法完成时才会发生这种情况。此外,如果所有剩余的线程都是守护程序线程,JVM将仅终止,因此如果这些KKMultiServerThreads是标准(非守护程序)线程,则即使在上面的循环完成之后,JVM也可能会持续存在,直到至少所有线程完成为止。
他们纠正上面循环的方法,是将listening
设置为false,然后在接受线程上调用interrupt()
。在这种情况下,accept()方法将返回并立即跳转到异常处理,然后try(resource)/ catch(更像是try / catch / finally close())将确保服务器正确关闭。这也将释放用于其他程序的端口。