Java에서의 Ctrl+C 캡처
Java 명령줄 어플리케이션에서 +C 신호를 포착할 수 있습니까?프로그램을 종료하기 전에 리소스를 정리하고 싶습니다.
VM이 종료될 때마다 실행되는 셧다운 후크를 VM에 연결할 수 있습니다.
Java 가상 시스템은 다음 두 가지 이벤트에 대해 종료됩니다.
마지막 비데몬 스레드가 종료되거나 종료(System.exit) 메서드가 호출되면 프로그램은 정상적으로 종료됩니다.
+C 입력과 같은 사용자 인터럽트 또는 사용자 로그오프 또는 시스템 종료와 같은 시스템 전체 이벤트에 대한 응답으로 가상 시스템이 종료됩니다.
단, 종료 후크로 전달하는 스레드는 몇 가지 규칙을 따라야 하므로 문제가 발생하지 않도록 링크된 설명서를 주의 깊게 읽어보십시오.여기에는 나사산 안전성 보장, 나사산 빠른 종단 등이 포함됩니다.
또, 코멘터 Jesper가 지적하고 있듯이, 셧다운 훅은 VM의 통상적인 셧다운시에 실행이 보증되고 있습니다만, VM 프로세스가 강제 종료되면 실행되지 않습니다.이 문제는 네이티브코드가 잘못되었거나 프로세스를 강제로 종료했을 때 발생할 수 있습니다(kill -9
,taskkill /f
).
하지만 그 시나리오에서는 모든 내기가 무효이기 때문에 나는 그것에 대해 너무 많은 생각을 낭비하지 않을 것이다.
빠른 콘솔 테스트를 위해...
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
Thread.sleep(200);
System.out.println("Shutting down ...");
//some cleaning up code...
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
});
상위 답변에서는 셧다운 후크를 사용할 것을 권장합니다.셧다운 훅은 가치보다 훨씬 더 큰 문제입니다.이러한 셧다운 훅은 미확정 순서로 실행되며 의존 라이브러리는 자체 셧다운 훅을 추가할 수 있습니다.즉, 셧다운 훅이 실행되기 전에 자신의 셧다운 훅에 의존하는 무언가가 초기화 해제될 수 있습니다.두통을 줄이고 신호 핸들러를 사용합니다.
Signal.handle(new Signal("INT"), // SIGINT
signal -> System.out.println("Interrupted by Ctrl+C"));
Signal
현재sun.misc.Signal
즉, 폐지됩니다.그러나 현재 대체되는 것은jdk.internal.misc.Signal
따라서 Java 팀이 비내부적인 방법으로 시그널 핸들러를 공개하는 방법을 알아낼 때까지 이 콜이 끊어질 수 있음을 주의해 주십시오.다만 (JDK 11 현재)sun.misc.Signal
아직 존재합니다.
언급URL : https://stackoverflow.com/questions/1611931/catching-ctrlc-in-java
'programing' 카테고리의 다른 글
오류 1452 MySQL 및 NodeJS.왜 데이터베이스가 내 테이블을 제대로 참조할 수 없는 거죠? (0) | 2022.10.14 |
---|---|
특정 문자 뒤에 문자열 부분 제거 (0) | 2022.10.14 |
사용자 입력 문자열을 정규식으로 변환하는 중 (0) | 2022.10.14 |
레일 표에서 어떤 인덱스를 추가할 때 (0) | 2022.10.14 |
임의 조건 함수에 따라 사전을 필터링하려면 어떻게 해야 합니까? (0) | 2022.10.14 |