如何使联网的JavaFX应用程序正确退出?

如何使联网的JavaFX应用程序正确退出?,java,multithreading,Java,Multithreading,我正在使用JavaFX制作一个简单的网络Tic-Tac-Toe游戏。要初始化服务器-客户端连接,我有两个类:serverSelectHandler和clientSelectHandler。为了建立连接,server类创建一个ServerSocket,创建一个普通套接字,然后创建一个处理数据传输的线程。客户机类是相同的,只是它没有ServerSocket 创建线程时,它将自己与RemoteInPurthandler类相关联。此类重写Runnable中的run方法。下面是它添加的一段代码: Stri

我正在使用JavaFX制作一个简单的网络Tic-Tac-Toe游戏。要初始化服务器-客户端连接,我有两个类:serverSelectHandler和clientSelectHandler。为了建立连接,server类创建一个ServerSocket,创建一个普通套接字,然后创建一个处理数据传输的线程。客户机类是相同的,只是它没有ServerSocket

创建线程时,它将自己与RemoteInPurthandler类相关联。此类重写Runnable中的run方法。下面是它添加的一段代码:

String input = netComm.reader.readLine();
while (input != null)
{
    // Make a separate copy of the input string 
    String inputCopy = input;
    // Post a work order to process the command on the GUI thread
    Platform.runLater( () -> {handleRemote(inputCopy);});
    // Get the next remote input
    input = netComm.reader.readLine();
}
如您所见,此方法使用lambda表达式将工单排队。我有一种感觉,这可能是造成我问题的原因

问题是Platform.exit不能完全终止此应用程序的实例。它会导致窗口关闭,但进程仍在后台运行。如果我忽略在ClientSelectHandler中设置线程,则不会发生此问题。但是,这会导致客户端忽略服务器发送的命令


上面链接的页面讨论了一个非常类似的问题。这就是为什么我认为我的问题可能与未关闭的额外线程有关。如有必要,我可以提供更多代码和/或解释。感谢您阅读此文章。

如果您只想立即退出应用程序,可以调用System.exit。但是,如果您想更干净一点,则必须重写Application.stop方法以在退出之前关闭所有后台线程。您可能希望查看用于处理后台线程的Worker和Task类


您的问题记录在API中。查看是否没有其他正在运行的非守护进程线程,JavaVM将退出。也许您不应该使用lambdas并跟踪正在启动的线程,以便在退出时关闭它们?是的,当我使用System.exit0而不是Platform.exit时,程序将完全停止。是什么使得System.exit不如其他退出方法干净?这是否等同于使用任务管理器终止进程?System.exit0终止JVM。这有时会导致各种空指针和系统异常,因为后台线程在释放资源时试图访问这些资源。例如,如果您有一个后台线程正在写入文件,则仅调用System.exit可能会导致问题。通常这没什么大不了的,但如果您记录输出,您可能会遇到一堆无关的异常,这使得很难区分崩溃和用户退出。