2014-11-13 4 views
0

나는 다음과 같은 문제가에서 산란. exit 명령이 있는데, 이는 ExecutorService에 의해 생성 된 모든 스레드를 포함하여 서버를 종료해야합니다. 클라이언트와 관련된 각각의 Thread에는 while -loop이 있는데, 관련 소켓의 InputStream을 사용하는 상태에서 클라이언트의 입력을 기다리고 있습니다. 또한 서버가 온라인 상태인지 나타내는 boolean 변수가 있습니다. false이 되 자마자 루프를 깨뜨리고 스레드를 종료합니다. 그것은 다음과 같이 기본적으로 같습니다은 ExecutorService를

// userInput - String 
// in - BufferedReader associated with the input stream of the client's socket 
while ((userInput = in.readLine()) != null && serverIsOnline) { 
    //do some stuff 
} 

그러나, 문제는 in.readLine()은 블록 조작이며 모든 클라이언트가 뭔가를 입력하지 않으면, 따라서 전체 서버가 종료되지 않을 것입니다. ExecutorService.shutDownNow() 또한 스레드가 다른 작업에 의해 차단 되었기 때문에이 경우에는 인터럽트가 비효율적이므로 작동하지 않습니다. 나는 또한 System.exit()을 피하고 싶다. 모든 효율적인 솔루션?

+1

가능한 스택 http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java –

+0

I think * BufferedReader가 중단되면 IOExecption을 발생시킵니다. 나는 실험하려고 노력할 것이다. – markspace

+0

System.exit *을 호출하면 실행중인 모든 스레드가 종료되고 아무 질문도 표시되지 않습니다. 그게 "어려운"방법. – Durandal

답변

1

모든 클라이언트 소켓을 닫으십시오. 이 경우는 모든 읽기 스레드가 IOException을 throw해야합니다.

+0

어떻게해야합니까? 나는 사용 된 소켓을 추적하지 않는다. 그것들은 각 클라이언트에 대해 생성 된 스레드 내에서 생성되므로 액세스 할 수 없습니다. –

+0

예, 모든 소켓을 추적해야합니다. 소켓을 공유 홀더 객체에 전달하여이를 수행 할 수 있습니다. 나는. 'Socket s = ...; holder.add (s)' –

+0

이 방법이이 문제를 해결하는 가장 좋은 방법이라고 생각하지 않지만 효과가 있었으므로 답변을 수락합니다. –

관련 문제