본문 바로가기

💻 개발/Java

자바 스레드(Thread) 간단 정리

모든 자바 프로그램은 기본적으로 스레드를 사용한다. JVM이 실행되면 main 메서드를 실행할 주 스레드뿐 아니라 가비지 컬렉션이나 객체 종료(Object Finalization)와 같은 JVM 내부 작업을 담당할 스레드도 생성된다.

자바 언어에서 사용할 수 있는 스레드(Thread)는 크게 데몬 스레드(Daemon Thread)와 일반 스레드(Non-daemon thread)로 나뉜다.

 

Daemon Thread

자바에서 데몬 스레드(Daemon Thread)는 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 다른 말로 하면 다른 스레드에 대한 백그라운드 스레드를 지원하는 특수한 스레드라고 할 수 있다. 

JVM이 처음 시작될 때 main 스레드를 제외하고 JVM이 내부적으로 사용기 위해 실행되는 모든 스레드는 데몬 스레드이며 가장 대표적인 데몬 스레드가 바로 가비지 컬렉터 스레드이다.

새로운 스레드가 생성 될 때는 자신을 생성해준 부모 스레드의 데몬 설정 상태 값을 확인해 그 값을 그대로 사용한다.(부모 스레드가 데몬 스레드이면 자식 스레드의 기본 상태도 데몬) 따라서 main 스레드에서 생성한 모든 스레드는 기본적으로 데몬 스레드가 아닌 일반 스레드가 된다. 데몬 스레드를 생성하고 싶다면 Thread의 setDaemon() 메서드에 true 값을 설정해준다.  

 

일반 스레드(Non-daemon Thread)와 데몬 스레드의 차이

일반 스레드와 데몬 스레드는 프로그램이 종료될 때 처리 방법이 약간 다를 뿐 그 외에는 모든 것이 동일하다.

스레드가 하나 종료되면 JVM은 남아있는 모든 스레드 가운데 일반 스레드가 남아있는지 확인한다. 만약 일반 스레드는 모두 종료되고 남아있는 스레드가 모두 데몬 스레드라면 JVM은 즉시 종료 절차를 진행한다. 즉 JVM이 종료될 때 모든 데몬 스레드는 버려지게 된다. 

이러한 데몬 스레드의 특성 때문에 보통은 부수적인 용도로 사용하는 경우가 많다.