데몬 쓰레드(Daemon Thread)

Reading time ~1 minute

데몬 쓰레드

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

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

  • 예로 가비지 컬렉터와 자동 저장 기능

  • 쓰레드 생성 후 실행 전에 setDaemon(true) 호출

실습1

public class TestDaemonThread1 extends Thread {
	public void run() {
		if (Thread.currentThread().isDaemon()) {// checking for daemon thread
			System.out.println("daemon thread work");
		} else {
			System.out.println("user thread work");
		}
	}

	public static void main(String[] args) {
		TestDaemonThread1 t1 = new TestDaemonThread1();// creating thread
		TestDaemonThread1 t2 = new TestDaemonThread1();
		TestDaemonThread1 t3 = new TestDaemonThread1();

		t1.setDaemon(true);// now t1 is daemon thread

		t1.start();// starting threads
		t2.start();
		t3.start();
	}
}

결과

user thread work
daemon thread work
user thread work

실습2

이미 실행 시킨 쓰레드를 데몬 쓰레드로 만들면 IllegalThreadStateException 발생 한다.

public class TestDaemonThread2 extends Thread {
	public void run() {
		System.out.println("Name: " + Thread.currentThread().getName());
		System.out.println("Daemon: " + Thread.currentThread().isDaemon());
	}

	public static void main(String[] args) {
		TestDaemonThread2 t1 = new TestDaemonThread2();
		TestDaemonThread2 t2 = new TestDaemonThread2();
		t1.start();
		t1.setDaemon(true);// will throw exception here
		t2.start();
	}
}

결과

쓰레드이기 때문에 출력 순서는 변경될 수 있다.

Exception in thread "main" java.lang.IllegalThreadStateException
	at java.lang.Thread.setDaemon(Thread.java:1359)
	at thread.TestDaemonThread2.main(TestDaemonThread2.java:13)
Name: Thread-0
Daemon: false

관련자료