程序在 bufferedreader 关闭时冻结
Program freezes on bufferedreader close
程序在关闭缓冲时冻结 reader。使用 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;
}
}
}
我已经检查以确保这确实是发生冻结的地方。有什么想法吗?
不可能。 BufferedReader.close()
不会做任何阻塞。你甚至不需要它。 PrintWriter.close()
将关闭所有内容。删除它。
这里唯一可以冻结的操作是关闭 PrintWriter
,这意味着刷新其缓冲区,其原因必须是对等方在读取该程序的输出后还有很长的路要走,或者根本不读。
BufferedReader 可以 在 close()
上阻塞,因为它在 lock
实例上包含一个 synchronized
块:
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
这意味着您的程序中有另一个线程与 BufferedReader 一起工作(可能在 read() 中被阻塞),当您尝试关闭时它持有锁。解决方案是让这个其他线程释放锁(必要时中断)以允许关闭获得锁然后完成。
程序在关闭缓冲时冻结 reader。使用 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;
}
}
}
我已经检查以确保这确实是发生冻结的地方。有什么想法吗?
不可能。 BufferedReader.close()
不会做任何阻塞。你甚至不需要它。 PrintWriter.close()
将关闭所有内容。删除它。
这里唯一可以冻结的操作是关闭 PrintWriter
,这意味着刷新其缓冲区,其原因必须是对等方在读取该程序的输出后还有很长的路要走,或者根本不读。
BufferedReader 可以 在 close()
上阻塞,因为它在 lock
实例上包含一个 synchronized
块:
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
这意味着您的程序中有另一个线程与 BufferedReader 一起工作(可能在 read() 中被阻塞),当您尝试关闭时它持有锁。解决方案是让这个其他线程释放锁(必要时中断)以允许关闭获得锁然后完成。