나는 다음과 같은 문제가에서 산란. 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()
을 피하고 싶다. 모든 효율적인 솔루션?
가능한 스택 http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java –
I think * BufferedReader가 중단되면 IOExecption을 발생시킵니다. 나는 실험하려고 노력할 것이다. – markspace
System.exit *을 호출하면 실행중인 모든 스레드가 종료되고 아무 질문도 표시되지 않습니다. 그게 "어려운"방법. – Durandal