2

我正在用 Java 编写服务器-客户端应用程序,我希望服务器在客户端崩溃或意外关闭时向客户端发送消息。

Runtime.getRuntime().addShutdownHook(new Thread(){
    public void run(){
        out.writeObject(new ServerQuit());
        out.close();
    }
}

whereout是用于写入客户端的输出流,ServerQuit表示服务器崩溃时发送的消息。

这样做安全吗?Javadocs 说人们不应该“盲目地依赖可能已经注册了自己的关闭钩子的服务,因此它们自己可能正在关闭过程中。” 由于 JVM 关闭时 I/O 流会自动关闭,所以我的关闭挂钩会起作用吗?也就是说,在关闭挂钩运行时,I/O 流是否已经关闭?

4

1 回答 1

0

I/O 流不会“在 JVM 关闭时自动关闭”。操作系统会关闭进程可能打开的所有文件套接字,但这与 JVM 的任何操作无关。因此,在关闭挂钩运行时,您的流仍处于打开状态。

但是,您正在做的事情是完全没有必要的。在任何情况下,客户端都会收到流的结束。这就是它所需要的。

于 2014-05-19T23:46:44.593 回答