【问题标题】:Closing I/O streams during a shutdown hook在关闭挂钩期间关闭 I/O 流
【发布时间】:2014-05-19 23:33:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我很确定在崩溃的情况下服务器会停止。不能真的依靠任何东西来崩溃。 idk 关于关机虽然...

标签: java io shutdown-hook


【解决方案1】:

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

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

【讨论】:

  • 所以没有必要发送 ServerQuit 消息,但应该关闭套接字吧?
  • 如果下面有BufferedOutputStream,你应该关闭ObjectOutputStream,以确保冲洗。否则就忘了它。
  • @EJP - 标准输入流 (System.in) 怎么样? .假设我创建了一个指向 System.in 的扫描器,如果我最后不调用scanned.close(),会发生什么?
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2015-09-22
  • 2011-02-11
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多