Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试使用资源和服务器套接字_Java_Multithreading_Sockets_Try Catch_Serversocket - Fatal编程技术网

Java 尝试使用资源和服务器套接字

Java 尝试使用资源和服务器套接字,java,multithreading,sockets,try-catch,serversocket,Java,Multithreading,Sockets,Try Catch,Serversocket,我在上阅读了KnockKnock服务器示例,发现了一些代码,对此我有一些疑问 try (ServerSocket serverSocket = new ServerSocket(portNumber)) { while (listening) { new KKMultiServerThread(serverSocket.accept()).start(); } } catch (IOException e) { System.err.println("Co

我在上阅读了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
    的范围是什么?它在捕获的异常块或周围块的其他地方可用吗?如果没有,如何可靠地关闭插座
  • 在这种情况下,套接字是如何关闭的?我假设此示例停止执行的唯一方法是强制结束进程,但在这一点之后,打开的套接字会发生什么情况?正在使用的端口是否不再可用于其他应用程序(甚至同一应用程序)
  • 新的KKMultiServerThread发生了什么变化?一旦线程完成其工作,垃圾收集器是否会清理该线程
  • 您不需要关闭ServerSocket,这就是try(resource)/catch习惯用法的用途。它确保资源最终被正确关闭和释放。所讨论的资源是所谓的资源

  • 与Java中保留的所有内存一样,一旦不再使用,它最终将被GC清除。但是,只有当此类线程的run()方法完成时,才会发生这种情况。此外,如果所有剩余线程都是守护进程线程,JVM将只终止,因此,如果这些线程是标准(非守护进程)线程,JVM可能会在上述循环完成后继续存在,直到至少完成所有线程

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

  • 您不需要关闭ServerSocket,这就是try(resource)/catch习惯用法的用途。它确保资源最终被正确关闭和释放。所讨论的资源是所谓的资源

  • 与Java中保留的所有内存一样,一旦不再使用,它最终将被GC清除。但是,只有当此类线程的run()方法完成时,才会发生这种情况。此外,如果所有剩余线程都是守护进程线程,JVM将只终止,因此,如果这些线程是标准(非守护进程)线程,JVM可能会在上述循环完成后继续存在,直到至少完成所有线程


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

    服务器套接字在其析构函数中自动关闭,线程也会“停止”。这里讨论了
    serverSocket
    变量的作用域:@JeroenBollen Java中没有析构函数。@EJP抱歉,混淆了服务器套接字在其析构函数中自动关闭,线程也会“停止”。这里讨论了
    serverSocket
    变量的作用域:@JeroenBollen Java中没有析构函数。@EJP抱歉弄糊涂了