본문 바로가기

강좌/JAVA THREAD

자바 쓰레드(Thread) - 데몬쓰레드(Daemon Thread)

1. 데몬쓰레드가 아닌 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행

2. 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료

3. 예로서 가비지 컬렉터, 워드 프로세서의 자동 저장, 화면 자동 갱신등이 있다.

4. 쓰레드를 생성한 다음 실행전에 setDㅁemon(true)를 호출.


쓰레드 종류는 크게 두가지다 : 사용자 쓰레드, 데몬 쓰레드.

이전에 했던 예제는 전부 사용자 쓰레드였다.


사용자 쓰레드는 독립쓰레드고 데몬쓰레드는 종속 쓰레드이다.


예제를 보자


1. 첫번째 예제

티스토리나 포털 사이트 게시판을 보면 임시저장..알아서 자동저장하는 기능들이 있다.

아무튼 이와 비슷하게 쓰레드를 이용해서 구현할수 있다.

다만 여기서 보여주는건 데몬은 보조적인 역할이라고 했는데 그걸 확인해보고자 한다.

일반 쓰레드가 종료되면 데몬쓰레드가 강제적으로 종료 되는지를 말이다.



현재 위의 소스는 메인 스레드가 생성후 일반 스레드가 생성이 되었다.

데몬이 아닌 일반스레드이다. 아래 결과를 보자.



메인 쓰레드가 종료가 됐는데도 다른 쓰레드는 계속해서 저장을 하고 있다.

문제다 메인이 종료 되면 같이 종료 해야 하는데..


이럴때 데몬쓰레드를 쓰면 좋다. 물론 flag를 이용해서 할 수도 있지만 놓치기 쉬울수도 있다.


위의 메인메소드 소스중 아래 생성한 쓰레드의 데몬여부를 true 해 놓는다.

그럼 데몬이 된다. 끝이다.

결과는 메인 종료후 더이상 작동하지 않는다.



2. 현재 동작중인 쓰레드를 보기(데몬쓰레드 포함)


우선 클래스 3개를 만들어 보자. 


첫번째로 메인 메소드가 있는 클래스

간단하다 앞으로 생성할 2개의 클래스 객체 생성후 스타트 시킨다.



두번째 클래스는 아무것도 안한다. 그냥 5초간 쉬었다가 움직이는것이다. 

결국 이것이 데몬인지 아닌지 확인하기 위해서 그냥 만들었다.


세번째 클래스 

이 클래스는 현재 돌아가는 스택을 찍어보는것이다. 그럼 모든 쓰레드들이 잡혀 나올것이고 데몬인지 아닌지 확인 할 수있다. 아래 println으로 찍었다.



결과 메인메소드 실행 시킨후 결과가 아래와 같이 나왔다.

메인 메소드는 당연히 데몬이 아니다. 쭉 보면 isDaemon하고 true인 녀석들이 있다.

우리가 만든 소스 이외에 자바는 알아서 몇가지 데몬을 돌린다. 리스너라든지, 핸들러등등..

이것들은 메인 쓰레드가 종료되면 같이 종료 된다. 일반쓰레드들이 아니기때문.