1

关闭缓冲读取器时程序冻结。使用 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;
        }
    }

}

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

4

2 回答 2

4

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

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

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

于 2017-08-16T01:12:05.087 回答
-1

不可能。BufferedReader.close()不做任何阻碍的事情。你甚至不需要它。PrintWriter.close()将关闭一切。去掉它。

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

于 2017-02-19T21:10:06.763 回答