Программа зависает на буфере читателя

Программа зависает при закрытии буферизованного ридера. Используя 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()), который удерживает блокировку при попытке закрытия. Решение состоит в том, чтобы этот другой поток снял блокировку (прерванную при необходимости), чтобы позволить закрытию получить блокировку, а затем завершить ее.

Другие вопросы по тегам