본문
데몬쓰레드(Daemon thread)
# 데몬쓰레드(Daemon thread)
컴퓨터 시스템의 운영에 관련된 작업을 후선(background) 상태로 동작하면서 실행하는 프로그램.
처리해야 할 작업 조건이 발생하면 자동으로 작동하여 필요한 작업을 실행한다.
일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료되는데, 그 이유는 데몬 쓰레드는 일반 쓰레드의 보조 역할을 수행하므로 일반 쓰레드가 모두 종료되고 나면 데몬 쓰레드의 존재의 의미가 없기 때문이다. 이 점을 제외하고는 데몬 쓰레드와 일반 쓰레드는 다르지 않다. 데몬 쓰레드의 예로는 가비지 컬렉션, 워드 프로세서의 자동저장, 화면 자동갱신 등이 있다.
데몬 쓰레드는 무한 루프와 조건문을 이용해서 실행 후 대기하고 있다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다. 데몬 쓰레드는 일반 쓰레드의 작성 방법과 실행 방법이 같으며, 다만 쓰레드를 생성한 다음 실행하기 전에 setDaemon(true)를 호출하기만 하면 된다.
1 2 3 4 5 6 | // 쓰레드가 데몬 쓰레드인지 확인한다. 데몬 쓰레드이면 true 반환한다. boolean isDaemon() // 쓰레드를 데몬 쓰레드 또는 사용자 쓰레드로 변경한다. // (매개변수 on의 값을 true로 지정하면 데몬 쓰레드가 된다.) void setDaemon(boolean on) | cs |
sample) 이 쓰레드를 데몬 쓰레드로 설정하지 않았다면 계속 무한 루프를 돌게된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package com.aimir.bo.device; class DaemonExample implements Runnable { static boolean autoSave = false; public static void main(String[] args) { Thread t = new Thread(new DaemonExample()); t.setDaemon(true); // 이 부분이 없으면 종료되지 않는다. // main 쓰레드가 종료되면 종속쓰레드인 t쓰레드도 종료된다. t.start(); for (int i = 1; i <= 20; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); if (i == 5) { autoSave = true; } } System.out.println("프로그램을 종료합니다."); } @Override public void run() { while (true) { try { Thread.sleep(3 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } if (autoSave) { autoSave(); } } } private void autoSave() { // TODO System.out.println("작업파일이 자동저장되었습니다."); } } | cs |
result)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 1 2 3 4 5 작업파일이 자동저장되었습니다. 6 7 8 작업파일이 자동저장되었습니다. 9 10 11 작업파일이 자동저장되었습니다. 12 13 14 작업파일이 자동저장되었습니다. 15 16 17 작업파일이 자동저장되었습니다. 18 19 20 프로그램을 종료합니다. | cs |
3초마다 변수 autoSave의 값을 확인해서 그 값이 true이면, autoSave()를 호출하는 일을 무한히 반복하도록 쓰레드를 작성하였다. 만일 이 쓰레드를 데몬 쓰레드로 설정하지 않았다면, 이 프로그램은 강제종료하지 않는 한 영원히 종료되지 않을 것이다. setDaemon 메서드는 반드시 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.
- 출처
http://terms.naver.com/entry.nhn?docId=1611073&cid=50372&categoryId=50372
http://devbox.tistory.com/entry/Java-%EB%8D%B0%EB%AA%AC%EC%93%B0%EB%A0%88%EB%93%9C
댓글