【问题标题】:Program freezes on bufferedreader close程序在缓冲阅读器关闭时冻结
【发布时间】:2017-07-08 22:41:11
【问题描述】:

关闭缓冲阅读器时程序冻结。使用 forge modding API for minecraft,但是我之前在使用独立服务器端代码时遇到过这个问题。这个特定的代码运行良好,然后随机开始给我这个问题,不知道如何解决这个问题..

关闭方法:

public static void closeConnection() {
    if (keepConnection) {
        keepConnection = false;

        try {

            bufferedReader.close();
            printWriter.close();
            socket.close();
        }
        catch (IOException e) {

            e.printStackTrace();
        }

        finally{

            token = null;
        }
    }

}

我已检查以确保这确实是发生冻结的地方。有什么想法吗?

【问题讨论】:

  • 什么是崩溃?即什么错误/异常和什么消息?
  • @1blustone 没有消息,它只是冻结了。例如,在我的 minecraft 示例中,客户端只是挂起,我必须强制关闭并重新启动
  • 冻结不是崩溃。崩溃伴随着退出和核心转储或堆栈跟踪。冻结是由阻塞或死锁引起的。

标签: java sockets crash bufferedreader buffered


【解决方案1】:

不可能。 BufferedReader.close() 不会做任何阻塞的事情。你甚至不需要它。 PrintWriter.close() 将关闭所有内容。删除它。

此处唯一可以冻结的操作是关闭PrintWriter,这意味着刷新其缓冲区,其原因必须是对等方远远落后于读取该程序的输出,或者没有读取完全没有。

【讨论】:

  • 删除 bufferedReader.close 完全解决了我的问题,就像我之前说的那样,我的问题似乎与那一行有关。 printWriter 的关闭是否实际上也关闭了阅读器?
  • 关闭套接字的输入流或输出流都会关闭套接字。您需要关闭PrintWriter,因为它意味着flush(),这是您唯一可能被阻止的地方。
  • 是的,这是有道理的。我可以关闭作者就好了,谢谢你的澄清
【解决方案2】:

BufferedReader 可以阻止close(),因为它在lock 实例上包含synchronized 块:

synchronized (lock) {
    if (in == null)
      return;
    in.close();
    in = null;
    cb = null;
}

这意味着您的程序中有另一个线程正在使用 BufferedReader(可能在 read() 中被阻塞),当您尝试关闭时,该线程正在持有锁。解决方案是让这个其他线程释放锁(必要时中断)以允许关闭获得锁然后完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多