Программа зависает на буфере читателя
Программа зависает при закрытии буферизованного ридера. Используя API моджинга forge для майнкрафта, я уже сталкивался с этой проблемой при использовании автономного кода на стороне сервера. Этот конкретный код работал нормально, а затем случайно начал выдавать мне эту проблему, не зная, как исправить это..
Закрытый метод:
public static void closeConnection() {
if (keepConnection) {
keepConnection = false;
try {
bufferedReader.close();
printWriter.close();
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}
finally{
token = null;
}
}
}
Я проверил, чтобы убедиться, что это действительно, где происходит замораживание. Есть идеи?
2 ответа
Невозможно. BufferedReader.close()
не делает ничего, что блокирует Тебе даже не нужно это. PrintWriter.close()
закрою все. Убери это.
Единственная операция, которая может заморозиться здесь - это закрытие PrintWriter
, что подразумевает очистку буфера, и причина этого должна заключаться в том, что одноранговый узел находится далеко позади чтения вывода этой программы или не читает его вообще.
BufferedReader может заблокировать close()
потому что он содержит synchronized
блок на lock
пример:
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
Это означает, что в вашей программе есть еще один поток, работающий с BufferedReader (возможно, заблокированный в read()), который удерживает блокировку при попытке закрытия. Решение состоит в том, чтобы этот другой поток снял блокировку (прерванную при необходимости), чтобы позволить закрытию получить блокировку, а затем завершить ее.