[Java] Daemon Thread

    반응형

    Goal

    1. 데몬 스레드와 사용자 스레드의 차이점에 대해 이해한다.

    2. 데몬 스레드의 생성 방법에 대해 이해한다.


    #1 데몬 스레드 & 사용자 스레드

    자바에서 스레드는 사용자 스레드와 데몬 스레드로 구분한다. 

    사용자 스레드는 Thread Class 를 상속받거나, Runnable 인터페이스를 구현하는 방식으로 생성한다. 

     

    [Java] 쓰레드 생성 방법 Thread & Runnable Interface

    ✨Goal1. Thread Class를 상속받아 스레드를 생성하는 방법에 대해 숙지한다.2. Runnable Interface를 구현하여 스레드를 생성하는 방법에 대해 숙지한다. 자바에서 스레드를 생성하는 방법은 Thread 클래스

    novlog.tistory.com

     

    자바 프로그램은 현재 프로세스 내부에 동작하고 있는 스레드가 모두 종료 상태로 들어간 후에 종료된다.  

    반면 사용자 스레드와 달리 데몬 스레드는 부가적인 스레드이다. 

    사용자 스레드가 모두 종료되면, 데몬 스레드의 실행 여부와 관계 없이 자바 프로그램이 종료된다. 

     

    대표적으로 백그라운드에서 돌아가는 프로세스나, 알림 , 메모리 관리, 네트워크 연결 관리 등 과 같은 기능들은 굳이 사용자 스레드로 생성할 필요가 없다. 

    따라서 상대적으로 중요하지 않은 작업을 처리하는 스레드나, 굳이 완료되지 않아도 되는 작업을 처리하는 스레드를 "데몬 스레드"로 생성하면 효율적이다.


    #2 데몬 스레드 생성 방법

    데몬 스레드 또한 사용자 스레드와 동일하게 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하는 방식으로 생성한다.

    데몬 스레드 객체 선언 후 setDaemon 메서드를 true로 설정해 주면 된다. 

    단, setDaemon으로 데몬 스레드를 명시하는 코드는 반드시 start() 메서드 실행 전에 작성해 주어야 한다.

    public class DemonThreadMain {
        public static void main(String[] args) {
    
            DaemonThread daemonThread = new DaemonThread();
            daemonThread.setDaemon(true);
            daemonThread.start();
    
        }
    
        static class DaemonThread extends Thread {
            @Override
            public void run() {
    			...
            }
        }
    
    
    }

     

    데몬 스레드 예제

    다음은 데몬 스레드와 사용자 스레드를 생성 후 각각 10초, 3초 씩 실행한 예제 코드이다.

    출력 결과를 보면 데몬 스레드의 종료 여부와 관계 없이 사용자 스레드의 작업이 모두 종료된 시점인 3초 후 프로세스가 종료되는 것을 확인할 수 있다.

    package thread.start;
    
    public class DemonThreadMain {
        public static void main(String[] args) {
    
            // Daemon Thread 10s 실행
            DaemonThread daemonThread = new DaemonThread();
            daemonThread.setDaemon(true);
            daemonThread.setName("Daemon Thread");
            daemonThread.start();
    
            // User Thread 1s 실행
            UserThread userThread = new UserThread();
            userThread.setName("User Thread");
            userThread.start();
    
        }
    
        static class DaemonThread extends Thread {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + ": run()");
                try {
                    Thread.sleep(10000); // 10초간 실행
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + ": run end()");
            }
        }
    
        static class UserThread extends Thread {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " : run()");
                try {
                    Thread.sleep(3000); // 3초간 실행
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + ": run end()");
            }
        }
    }
    Daemon Thread: run()
    User Thread : run()
    User Thread: run end()
    반응형

    댓글

    Designed by JB FACTORY