2011-01-22 4 views
2

이론적으로 다른 환경에서 사용할 수있는 Java 클라이언트를 작성 중입니다 : Java main(), 서블릿 컨테이너 또는 종속성 주입을 통해.실행 종료시 자동으로 종료되는 스레드 풀을 구현하는 방법은 무엇입니까?

클라이언트는 내부 연결 스레드 풀링을 구현합니다.

이 접근법의 문제점은 내부 스레드 풀이 구현된다는 사실을 모르는 클라이언트 사용자는 시스템 종료시 자신의 응용 프로그램이 "정지"되는 것을 보게됩니다. 내 사용자는 라이브러리에 shutdown() 메시지를 보내야한다는 것을 알아야합니다.

다른 대체 방법을 사용할 수 있는지 궁금합니다. 한편으로는 내 연결을 위해 스레드 풀을 시작할 수있게 해줍니다. 그리고 다른 한편으로 JVM 이벤트가 발생하면 JVM 이벤트가 발생하여 shutdown() 구현을 호출 할 수 있습니다.

+0

가능한 복제본 [끝내지 않을 Java 프로세스를 어디서 조사해야합니까?] (http://stackoverflow.com/questions/3236427/where-do-i-start-investigating-my-java-process - 끝 - 끝 - 끝) – finnw

답변

5

이전 제안 된 것처럼 후크를 추가 할 수 있지만 여전히 남아있는 문제는 여전히 활성 스레드가있는 스레드 풀입니다.

개별 스레드를 "데몬"(Thread.setDaemon 메서드를 통해)으로 표시하면 데몬 스레드 만 남아 있으면 JVM이 살아있을 수 없다고 생각합니다. JavaDoc의에서

:

마크 데몬 스레드 또는 사용자 스레드로 스레드. 실행중인 유일한 스레드가 모든 디먼 스레드 인 경우 JVM (Java Virtual Machine)이 종료됩니다. 이 사용

기본 비 데몬 스레드가 종료되면, JVM이 때문에 다른 스레드 실행의 "-끊고"하지 않으며,이 명시 적으로 지시를 종료 보낼 필요없이 종료 후크를 트리거 다양한 스레드.

0

코드 사용자가 종료 할 스레드 풀을 인식하지 못하는 문제가 있다면 해결책은이를 알 수 있도록하는 것입니다. 해당 클래스의 팩토리 메서드 또는 생성자에서 호출자가 해당 수명주기를 담당하도록 ExecutorService을 인수로 사용합니다. 즉, 정책을 추진하기 위해 의존성 주입을 사용합니다.

관련 문제