여러 클라이언트를 처리하기 위해 여러 스레드를 생성하는 간단한 서버를 만들고 있습니다. 서버를 종료 할 때 다양한 스트림과 스레드를 종료하고 닫는 적절한 방법이 궁금합니다.Java : 여러 스레드를 제대로 닫음
서버를 종료하라는 메서드를 실행하는 shutdownHook을 추가했습니다. 서버는 종료 된 모든 스레드에 대해 종료 호출을 브로드 캐스팅합니다.이 스레드는 각 스레드의 "isClosed"부울을 true로 설정합니다.
내가 기대하고있는 것은 run() 메서드의 끝에 도달하여 다시 반복 될 때 각 스레드가 while (! isClosed) 조건을 만족하므로 모든 적절한 소켓/스트림을 닫음으로써 올바르게 종료된다는 것입니다 돌아 오는 중.
그러나 shutdownhook이 완료된 후 프로그램이 종료되어야하므로이 프로그램이 제대로 종료되는지는 알 수 없습니다. 모든 것이 끝내는 메시지를 전달하기 때문에 상당히 일찍 완료됩니다. 이것은 일부 스레드가 제대로 닫히기에 충분한 시간을 얻지 못한다는 것을 의미합니까?
그렇다면 가장 좋은 방법은 shutdownhook이 모든 스레드를 수동으로 닫고 돌아가기 전에 닫았는지 확인하는 것입니다.
기본 접근법은 잘못은 아니지만 스레드에 차단 호출이있는 경우 'Thread.interrupt()'를 조사 할 수도 있습니다. (그리고 모든 호출이 인터럽트 가능하지는 않다는 것을 알고 있어야한다.) 정규 소켓 읽기는 그렇지 않다. – millimoose
만약 non-daemon 쓰레드라면, JVM은 shutdownHook과 상관없이 run 메소드로부터 모든 쓰레드가 반환 될 때까지 종료하지 않을 것이다. 메서드가 반환되었습니다. – Affe
executorervice를 사용하여 스레드를 관리하고 완료되면 executorervice를 종료하십시오. – assylias