2012-10-29 3 views
3

나는 모든 server.accept()에 대해 새로운 쓰레드를 생성하는 작은 TCP 쓰레드 서버를 코딩했다. 거의 모든 것이 훌륭하게 작동하지만 인터럽트 당 모든 스레드를 죽일 수있는 문제가 있습니다. (ServiceExecutor를 사용하여 스레드를 관리합니다. 따라서 shutdownNow 메서드를 사용하여 interrupt-method를 사용합니다.) Worker-instances는 BufferedReader를 사용하며 입력을 받고 계산하는 readline-method입니다. AFAIK readline 블록은 인터럽트에 반응하지 않지만 어떻게 중지합니까?종료 TCP 쓰레드 서버

while(!isInterrupted()){ 

    try { 
      clientSocket = this.serverSocket.accept(); 
     } catch(IOException e){ 
      break; 
     } 

     this.threadPool.execute(new ThreadWorker(clientSocket)); 
    } 

    threadPool.shutdownNow(); 

    try{ 
     serverSocket.close(); 
    }catch(IOException e){ 
     //todo 
    } 

입출력 스트림을 없애기 위해 ServerSocket을 닫으려고했으나 예상대로 작동하지 않았습니다.

+3

이상적으로 무기한 차단되는 메서드를 호출하지 마십시오. –

+0

http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java?rq=1 및 http://stackoverflow.com/questions/1948317/forceful-termination도 참조하십시오. thread-st-on-an-api-call-of-some-method? rq = 1 – DNA

+0

'C'에서 신호를 보냅니다. – alk

답변

4

몇 가지 대안 :

1) 전체 응용 프로그램을 종료하고, 명시 적으로 가까운 System.exit와를 호출하는 중요성의 아무것도없는 경우 (0). 건강 경고 - 일부 개발자는 apoplectic fit을 가지고 끝없이 '정상적으로 정리하기'에 관해 게시합니다.

2) accept() 스레드에 모든 클라이언트 소켓의 스레드 안전 목록을 보관하십시오. 클라이언트 <> 서버 스레드에 전달되는 클라이언트 컨텍스트의 일부로이 목록에 대한 참조를 전달하십시오. accept() 스레드의 목록에 새 연결을 추가합니다. 클라이언트 스레드가 연결을 발견하면 해당 항목을 목록에서 제거하십시오. 모든 클라이언트를 닫으려면 목록을 반복하고 클라이언트 소켓을 닫습니다. 그러면 클라이언트 스레드에서 readline 메서드가 오류와 함께 초기에 반환됩니다.

+0

+1은 'apoplectic'입니다. – grieve