티스토리 뷰

이전 포스팅에서 Thread에 대해서 간단하게 알아봤다면 이번에는 Thread 비정상 종료시 대응하는 방법에 대해 알아보겠다.

물론 나도 책을 보기전까지는 몰랐던 내용이다. -_-;

 

다음과 같은 코드가 있을때 MainThread가 죽어도 그 안에서 생성한 Thread는 살아서 동작하고 있다.




 

그럴때 동작중인 Thread를 종료하고 싶으면 Ctrl + C를 이용하면 현재 실행중인 JVM을 종료하면 된다. 


그러나 이러한 종료상황은 안에서 동작하던 Thread의 입장에서는 비정상 종료이고 

 

예기치 못한 결과를 얻을 수도 있다. (ex. 파일 저장중 강제종료로 인한 파일손상등...)

 

 

따라서 프로그램 실행중 종료가 요청되면 종료전에 필요한 수행작업을 꼭 하고 종료되어야 한다.

 

그래서 우리는 ShutDownHook을 이용해서 스레드 종료전 작업을 완료시켜보자!

코드는 다음과 같습니다.

 

 

중요한 점은 사용자가 만든 ShutDownHook 클래스를 Runtime의 ShutDownHook에 Add 한다는 것이다.


Thread shutDownHook = new ShutDownHook( Thread.currentThread(), "ShutDown");
Runtime.getRuntime().addShutdownHook(shutDownHook);

 

그래서 ShutDown 이벤트가 일어났을때 사용자가 만든 ShutDownHook 클래스(Thread) 가 실행되고

이 안에서 동작하던 Thread(TerminateSample1)의 ShutDown() 함수를 호출함으로써 작업의 마무리를 다 하고 isAlive를 false로 바꾼다.

그후 join()을 통해서 Thread(TerminateSample1)의 종료를 기다린후 Thread(TerminateSample1)가 종료되면 자신도 종료된다. 

제가 글을 잘 못써서 설명이 조금 복잡해 보이지만 실제로 보면 아주 간단할 것입니다.

조금더 이해를 쉽게하기 위해 순서도를 가져와 봤습니다.





결과화면은 다음과 같습니다.

 

 

ShutDownHook 클래스에서 ShutDown()을 호출한뒤 작업 마무리후 Thread(TerminateSample1)가 종료되는것을 볼수 있습니다.

다음에는 MainThread와 동시에 종료되는 Daemon Thread에 대해서 포스팅 해야겠습니다~

누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~ 

댓글