我正在使用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/
上面链接的页面讨论了一个非常类似的问题。这就是为什么我认为我的问题可能与未关闭的额外线程有关。如有必要,我可以提供更多代码和/或解释。感谢您阅读本文。
答案 0 :(得分:0)
如果您只是想立即退出应用程序,可以调用System.exit()。但是,如果您想要更干净一点,那么在退出之前,您必须覆盖Application.stop()方法以关闭所有后台线程。您可能希望查看Worker和Task类来处理后台线程。