我正在用 Java 编写一个服务器客户端应用程序,我希望服务器在客户端崩溃或意外关闭时向客户端发送消息。
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
out.writeObject(new ServerQuit());
out.close();
}
}
其中out
是用于写入客户端的输出流,ServerQuit
表示服务器崩溃时发送的消息。
这样做安全吗? Javadocs 表示,人们不应该“盲目依赖可能已经注册了自己的关闭 Hook 并因此可能正在关闭过程中的服务”。由于 JVM 关闭时 I/O 流会自动关闭,那么我的关闭钩子(Hook)会起作用吗?也就是说,在关闭钩子(Hook)运行时,I/O 流是否已经关闭?
最佳答案
I/O 流不会“当 JVM 关闭时自动关闭”。 操作系统关闭进程可能保持打开状态的任何文件和套接字等,但这与JVM的任何操作无关。因此,在关闭 Hook 运行时,您的流仍然处于打开状态。
但是你正在做的事情是完全没有必要的。无论如何,客户端都会收到流结束。这就是它所需要的。
关于java - 在 shutdown hook 期间关闭 I/O 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23748797/