자바.lang.Runtime.addShutdownHook()갈고리 프로그램 을 이용 하여 자바 프로그램 이 안전하게 종료 되도록 합 니 다.

9682 단어 shutdown
이전 에는 개발 할 때 데이터베이스 업무 에 의존 하여 프로그램 이 종 료 될 때 데이터 의 완전 성 을 확보 할 줄 만 알 았 다.그러나 어떤 때 는 업무 상 요구 되 는 원자 조작 이 반드시 데이터베이스,예 를 들 어 외부 인터페이스 나 메시지 대기 열 만 포함 하 는 것 은 아니다.이때 데이터베이스 업 무 는 무력 하 다.이 때 우 리 는 자바 가 제공 하 는 도구 방법 에 의존 할 수 있 습 니 다.자바.lang.Runtime.addShutdown Hook(Thread hook)addShutdown Hook 방법 은 갈 고 리 를 추가 하여 프로그램 이 종 료 될 때 이 갈 고 리 를 터치 할 수 있 습 니 다.
(탈퇴 란 ctrl+c 또는 kill-15 를 말 합 니 다.그러나 kill-9 를 사용 하면 어 쩔 수 없습니다.구체 적 으로 kill 과 관련 된 signal 체제 에 큰 소 가 있 는 글 이 있 습 니 다《Linux 신호 신호 처리 메커니즘》)갈 고 리 는 어떤 조작 을 해도 됩 니 다.심지어 특정한 스 레 드 의 상 태 를 순환 적 으로 검사 할 수 있 습 니 다.업무 스 레 드 가 정상적으로 탈퇴 할 때 까지 갈고리 절 차 를 마치 면 업무 스 레 드 의 완전 성 을 확보 할 수 있 습 니 다.
예 프로그램 은 다음 과 같 습 니 다.
인 스 턴 스 프로그램 은 실행 과정 에서 ctrl-c 또는 kill-15 를 누 르 고 갈고리 프로그램의 순환 검 측 으로 인해 스 레 드 가 실 행 된 후에 야 프로그램 이 닫 힐 수 있 습 니 다.
 1 /**

 2  * Created by IntelliJ IDEA.

 3  * User: Luo

 4  * Date: 13-7-11

 5  * Time:   3:12

 6  */

 7 

 8 public class TestShutdownHook {

 9 

10     /**

11      *     ,          

12      */

13     private static class TaskThread extends Thread {

14         @Override

15         public void run() {

16             System.out.println("thread begin ...");

17             TestShutdownHook.sleep(1000);

18             System.out.println("task 1 ok ...");

19             TestShutdownHook.sleep(1000);

20             System.out.println("task 2 ok ...");

21             TestShutdownHook.sleep(1000);

22             System.out.println("task 3 ok ...");

23             TestShutdownHook.sleep(1000);

24             System.out.println("task 4 ok ...");

25             TestShutdownHook.sleep(1000);

26             System.out.println("task 5 ok ...");

27 

28             System.out.println("thread end

"); 29 } 30 } 31 32 /** 33 * hook , 34 * @param checkThread 35 */ 36 private static void addShutdownHook(final Thread checkThread) { 37 // TaskThread , ShutdownHook 38 Runtime.getRuntime().addShutdownHook(new Thread() { 39 public void run() { 40 System.out.println(" ,hook , ..."); 41 // , , , \ 42 for (int i = 0; i < 100; i++) { 43 if (checkThread.getState() == State.TERMINATED) { 44 System.out.println(" , hook"); 45 return; 46 } 47 TestShutdownHook.sleep(100); 48 } 49 System.out.println(" , , hook, "); 50 } 51 }); 52 } 53 54 55 private static void sleep(long millis) { 56 try { 57 Thread.sleep(millis); 58 } catch (InterruptedException e) { 59 e.printStackTrace(); 60 } 61 } 62 63 public static void main(String[] args) throws InterruptedException { 64 final TaskThread taskThread = new TaskThread(); 65 // TaskThread , ShutdownHook 66 addShutdownHook(taskThread); 67 // TaskThread 68 taskThread.start(); 69 } 70 71 }

좋은 웹페이지 즐겨찾기