如何让联网的JavaFX应用程序正常退出?

时间:2014-10-24 22:53:29

标签: java multithreading

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

创建Thread时,它会将自己与RemoteInputHandler类关联。此类重写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中设置线程,则不会发生此问题。但是,这会导致客户端忽略服务器发送的命令。

http://jabahan.com/javafx-application-not-properly-closed-even-if-the-platform-exit-is-used/

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

1 个答案:

答案 0 :(得分:0)

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

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm