Runtime.addShutdownHook()

2015. 9. 30. 11:26Java

가장 좋은건 역시 doc에 있는 내용이다.
http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)


출처 : http://hellotojavaworld.blogspot.com.au/2010/11/runtimeaddshutdownhook.html 

모든 자바 프로그램은 JVM에 shutdown hook을 달아 줄수 있다. 
다운 되기 전에 JVM이 반드시, 실행해야만 하는 것이다.

프로그램이 종료되는 경우는 다양하다. 뭐 이런 경우에 대한 내용은 참조를 확인하고,
아무튼 정상 혹은 비정상 적으로 종료 될 때, 스레드에 자동 실행되는 되도록 등록 처리해주는 함수 이다.

Runtime.addShutdownHook(Thread hook)은 매우 유용한 툴이라고 하고, 
특별히 서버등을 구현같은 큰 어플리케이션을 구현할 때 보다 더 유용하다고 한다.


아래와 같이 쓰레드의 run 메소드에 명령(instructions, java code) 을 작성하고, java.lang.Runtime.addShutdownHook(Thread t)를 호출 합니다. 그럼 요 메소드상에 쓰레드를 JVM의 shutdown hook에 등록하고,  JVM Showdown 시에 JVM이 병렬적으로 실행합니다.  병렬처리로 인해 동시성을 유지하기에, deadlock 이나 race condition이 존재하지 않도록 주의해야 합니다.

public class AddShutdownHookSample {

public void attachShutDownHook(){

Runtime.getRuntime().addShutdownHook(new Thread() {

@Override

public void run() {

System.out.println("Inside Add Shutdown Hook...(3)");

}

});

System.out.println("Shut Down Hook Attached...(1)");

}

public static void main(String[] args) {

AddShutdownHookSample sample = new AddShutdownHookSample();

sample.attachShutDownHook();

System.out.println("Last instruction of Program.... (2)");

System.exit(0);

}

 }


실행 결과는 아래와 같이 나온다.


Shut Down Hook Attached. (1)

Last instruction of Program.... (2)

Inside Add Shutdown Hook...(3)


어플리케이션에 이걸 구현한다면, 몇가지 유의할 점에 대해서만 정리합니다.


- Shutdown hooks의 개수 : 제한 없다.

- Shutdown hook을 붙여야 하는 시점은 언제든지 붙여도 된다. 
  단순한 이야기 이지만, 셧다운 되기 전에 어떤 인스턴스든지 붙여놔야 겠지.

- 같은 hook을 다시 붙이는 것은 할수 없다."Hook previously rfegisted"라는 IllegalArgumentException이 발생한답니다.

- De-register a Hook : Runtime.removeShutdownHook 메소드를 호출하는 것 만으로, 훅을 제거 할 수 있다. 
  하지만 익명 내부 클래스를 사용해서 셧다운을 대부분 등록하는데, 이 것을 사용할수 있는 어떤 참조도 가질수 없기 때문에, 우리는 익명 내부 클래스를 우리가 제거할지 모르는 훅들에 대해서는 사용하면 안된다. 
removeShutdownHook 메소드에 이 참조를 전달 해야하기 때문이랍니다.

- 동시성을 유지하는 것을 지켜요 : 앞서 말한대로.

- Shutdown Hook의 Reliability(신뢰도) : JVM은 최선을 다해 실행하겠지만, 모두 다 실행된다고 보장 할 수 없다고 한다. 

- Hook들에 의한 시간 소비를 유의해라 : 셧다운 할 때 시간 소비 하지 않는것이 중요하다. 


몰라 몰라 한글로 좀 더 설명을 원해?

참고 : http://javacan.tistory.com/entry/86 


'Java' 카테고리의 다른 글

core java 따라하기 - 1  (0) 2017.06.13
JUnit5 개념 잡기  (0) 2017.06.02
java8 StringJoiner 과 String.join 활용  (0) 2016.01.05
ThreadLocal 이 뭘까요?  (0) 2016.01.05
Apache Daemon 에 대해서  (3) 2015.12.08
Top 10 Useful, Yet paranoid Java Programming Techniques  (0) 2015.09.15
Exception  (0) 2013.08.04
Regular Expressions in Java  (0) 2013.07.30
Delegate, Event , Ramda  (0) 2013.07.04
Struts2 도 해보자 시작1  (0) 2013.06.30