본문 바로가기

JAVA

JAVA(2022.06.07) - 데몬 쓰레드

  • 일반 쓰레드의 작업을 돕는 보조적인 쓰레드 
  • 일반  쓰레드가 모두 종료되면 데몬 쓰레드는 강제종료가 아닌, Runnable 상태로 돌아간다  > 매우 중요함 
  • 가비지 컬렉션, 워드 프로세서 자동저장, 화면 자동갱신 등에서 사용됨 
  • setDaemon(true) 메소드를 사용하여야 하고, 스레드가 실행되기 전에만 호출해야 예외가 발생하지 않는다  
  • 무한루프와 조건문을 통해 대기하도록 만들고 조건 충족 시 작업 후 다시 대기하도록 만든다

 

코드예시 

 

    // Runnable을 구현하는 DaemonThread클래스를 작성
    public class DaemonThread implements Runnable {

        // 무한루프안에서 0.5초씩 쉬면서 데몬쓰레드가 실행중입니다를 출력하도록 run()메소드를 작성
        @Override
        public void run() {
            while (true) {
                System.out.println("데몬 쓰레드가 실행중입니다.");

                try {
                    Thread.sleep(500);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break; //Exception발생시 while 문 빠찌도록 
                }
            }
        }

        public static void main(String[] args) {
            // Runnable을 구현하는 DaemonThread를 실행하기 위하여 Thread 생성
            Thread th = new Thread(new DaemonThread());
            // 데몬쓰레드로 설정
            th.setDaemon(true);
            // 쓰레드를 실행
            th.start();

            // 메인 쓰레드가 1초뒤에 종료되도록 설정. 
            // 데몬쓰레드는 다른 쓰레드가 모두 종료되면 자동종료.
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }   
            System.out.println("메인 쓰레드가 종료됩니다. ");    
        }   
    }

출력결과 

ex1)

데몬 쓰레드가 실행중입니다.

데몬 쓰레드가 실행중입니다. 

메인 쓰레드가 종료됩니다. 

 

ex)2

데몬 쓰레드가 실행중입니다.
데몬 쓰레드가 실행중입니다.
메인 쓰레드가 종료됩니다.
데몬 쓰레드가 실행중입니다.

 

이유

쓰레드는 실행 순서가 순차적이지 않기 때문이다. 또한, 데몬 쓰레드는 메인 쓰레드가 종료되어도 Runnable 상태로 돌아가기 때문에 메인 쓰레드가 종료되어도 작동이 되고 있을 수도 있다. 

 

 

 

 

 

 

* 위 게시물은 프로그래머스<자바중급> 강의를 복습하며 작성한 글입니다*