程序在bufferedreader关闭时冻结

时间:2017-02-19 18:37:36

标签: java sockets crash bufferedreader buffered

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

关闭方法:

VM34065:11

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

这里可以冻结的唯一操作就是关闭PrintWriter,这意味着刷新缓冲区,原因必须是对等体在阅读该程序的输出后还有很长的路要走,或者不是完全阅读它。