비슷한 문제가있었습니다. 기본적으로 장황한 데몬 프로세스 인 Java 프로그램이 있습니다. 그것들을 멈추고 바운스 (다시 시작) 할 수있는 것이 좋다.
저는 두 가지 방법을 사용했습니다. 둘 다 장점과 단점이 있습니다. 하나는 신호 처리기를 설정하는 것입니다.이 함수는 프로그램의 일부 클래스에 있습니다 (예를 들어 main 메서드를 사용하는 클래스에 있습니다).
import sun.misc.Signal;
import sun.misc.SignalHandler;
...
private static boolean stopNow = false;
private static boolean restartNow = false;
...
private static void handleSignals() {
try {
Signal.handle(new Signal("TERM"), new SignalHandler() {
// Signal handler method for CTRL-C and simple kill command.
public void handle(Signal signal) {
MyClass.stopNow = true;
}
});
}
catch (final IllegalArgumentException e) {
logger.warn("No SIGTERM handling in this instance.");
}
try {
Signal.handle(new Signal("INT"), new SignalHandler() {
// Signal handler method for kill -INT command
public void handle(Signal signal) {
MyClass.stopNow = true;
}
});
}
catch (final IllegalArgumentException e) {
logger.debug("No SIGINT handling in this instance.");
}
try {
Signal.handle(new Signal("HUP"), new SignalHandler() {
// Signal handler method for kill -HUP command
public void handle(Signal signal) {
MyClass.restartNow = true;
}
});
}
catch (final IllegalArgumentException e) {
logger.warn("No SIGHUP handling in this instance.");
}
}
이것은 제작 과정에서 튼튼하게 작동했습니다. 이 작업을 위해서는 정품 Sun JRE가 필요합니다. 일반적인 리눅스 배포판과 함께 제공되는 패키지에는 Signal 항목이 없습니다. 그것은 Windows에서도 잘 작동하지만 HUP 신호를 얻지는 못합니다. 이 작업을 시작하려면 바로 가기 나 셸 스크립트가 필요합니다.
또한 신호 처리가 큰 뚱뚱한 일이라는 것을 명심하십시오. 신호 처리기 내부에서 많은 작업을하지 마십시오. 내 샘플 코드는 단순히 정적 플래그를 설정한다는 것을 알 수 있습니다. 내 프로그램의 다른 부분은 플래그가 변경된 것을 감지하고 종료합니다. 나는 신호 처리기 내부에서 좀 더 복잡한 코드를 실험 해 볼 수 있었지만 QA 부담을 느끼는 것 같지 않았습니다.
다른 접근법은 프로그램을 서블릿으로 구조화하는 것입니다. 이 경우 HttpServlet을 확장하는 클래스를 작성합니다. worker 스레드를 시작하는 메소드로 Servlet.init를 재정의하십시오. 마찬가지로 Servlet.destroy를 스스로 종료하는 메서드로 재정의하십시오.
그런 다음 Tomcat과 같은 Java EE 컨테이너 서버를 사용하여 시작 및 중지를 관리 할 수 있습니다.
JFrame.close()는 설정하지 않으면 프로그램을 종료하지 않습니다. 기본 비헤이비어는 프레임을 숨기는 것입니다. 창 닫기 이벤트를 처리하거나 창을 닫을 때 종료하도록 기본 동작을 설정할 수 있습니다. –