2017-02-19 2 views
-2

버퍼링 된 리더를 닫을 때 프로그램이 멈 춥니 다. minecraft 용 단조 modding API를 사용했지만 이전에는 독립 실행 형 서버 측 코드로이 문제를 겪었습니다. 이 특정 코드는 무작위로이 문제를 해결 대해 이동하는 방법, 확실하지 않은 나에게이 문제를주고 시작 후 잘 작동하고 ..bufferedreader에서 프로그램이 종료됩니다.

닫기 방법 :

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() 블록는 lock 인스턴스에서 synchronized 블록이 포함되어 있기 때문에 :

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

이 가능 읽기에 차단의 BufferedReader (작업 프로그램에서 다른 스레드가 의미를()) 당신이 닫으려고 할 때 자물쇠를 잡고있다. 해결책은이 다른 스레드가 잠금을 해제 (필요한 경우 중단)하여 닫기가 잠금을 완료 할 수있게하는 것입니다.

관련 문제