2017-02-19 54 views
-2

Программа зависает при закрытии буферизованного считывателя. Используя API-интерфейс forge modding для minecraft, однако у меня была эта проблема раньше с автономным кодом на стороне сервера. Данный код работает нормально, а затем случайно начал давать мне этот вопрос, не знаю, как идти о фиксации этого ..Программа зависает на буферизаторе закрывается

Тесное метод:

public static void closeConnection() { 
    if (keepConnection) { 
     keepConnection = false; 

     try { 

      bufferedReader.close(); 
      printWriter.close(); 
      socket.close(); 
     } 
     catch (IOException e) { 

      e.printStackTrace(); 
     } 

     finally{ 

      token = null; 
     } 
    } 

} 

Я проверил, чтобы убедиться, что это действительно где происходит замораживание. Есть идеи?

+0

И что такое авария? т.е. какая ошибка/исключение и какое сообщение? – Moira

+0

@ 1blustone Нет сообщений, он просто зависает. Например, в моем примере minecraft клиент просто зависает, и мне нужно принудительно закрыть и перезагрузить – user3681585

+0

Замораживание не является крахом. Авария сопровождается выводом и дампом ядра или трассировкой стека. Замораживание вызвано блокировкой или блокировкой. – EJP

ответ

0

Невозможно. BufferedReader.close() не делает ничего, что блокирует. Тебе это даже не нужно. PrintWriter.close() закроет все. Убери это.

Единственная операция, которая может замерзнуть здесь, заключается в закрытии PrintWriter, что подразумевает очистку его буфера, и причина этого заключается в том, что сверстник намного отстает от чтения выхода этой программы или не читает ее вообще.

+0

Удаление bufferedReader.close полностью исправляет мою проблему, как я уже говорил ранее, моя проблема, похоже, связана с одной строкой. Действительно ли закрытие printWriter закрывает читателя? – user3681585

+0

Закрытие входного потока или выходного потока сокета закрывает сокет. Вам нужно закрыть 'PrintWriter', потому что это подразумевает' flush() ', который является единственным местом, где вы можете блокировать. – EJP

+0

Да, это имеет смысл. Я могу закрыть писателя просто отлично, спасибо за разъяснение – user3681585

1

BufferedReader может блок на close(), потому что он содержит synchronized блок на lock Например:

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

Это означает, что есть еще одна тема в программе работает с BufferedReader (возможно, заблокирован в чтении()), который удерживает замок, когда вы пытаетесь закрыть. Решение состоит в том, чтобы этот другой поток отпустил блокировку (прерван, если необходимо), чтобы позволить закрыть, чтобы завершить блокировку.