Java/Basic

[Java/Basic] Daemon Thread란? 백그라운드 실행데몬?

Jeong Jeon
반응형

프로젝트를 진행하다보면 Daemon Thread를 사용해야 할 경우가 있다.

본인은 서버가 시작될떄 background로 떠있는 daemon이 필요하여, Daemon Thread를 사용하였다.

 

자 그럼 Daemon Thread란? 무엇인가.

자바에서 스레드는 각자의 작업이 끝날때까지 계속해서 작업을 하게 되어 있다.

Daemon Thread는 main Thread가 종료될때 같이 종료가 되는 점을 이용한 자식 Thread라고 보면된다.

 

Daemon Thread

: 주 스레드의 작업을 돕는 보조적인 역할을 수행

: 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동종료

 => 워드 프로세서의 자동저장, 미디어 플레이어의 동영상 및 음악재생 등

 

Daemon Thread 설정 방법

사용법은 간단하다. Thread를 사용할때 Thread생성 후 setDaemon(true)만 지정해주면 끝이난다.

 

:주 스레드가 데몬이 될 스레드의 setDaemon(true)를 start() 메소드 호출전에 호출

  => 그렇지 않으면 illegalThreadStateException 발생한다.

 

public class PushDaemonWebAppListener implements ServletContextListener, Runnable{

    private Thread thread;
    private boolean isShutdown = false;
    
    public void startDaemon() {
       if (thread == null) {
           thread = new Thread(this, "Daemon thread for background task");
           thread.setDaemon(true);
       }
       if (!thread.isAlive()) {
           thread.start();
       }
    }
    
    //Thread
    public void run() {
    		Thread currentThread = Thread.currentThread();
            System.out.println("@@@ Name : " + Thread.currentThread().getName() + "@@@");
            //로직
            while(!this.isShutdown){
            	try{
            		System.out.println("alive");
                    Thread.sleep(1000);
                    //10초마다 살아있다 알려주기
                }catch(Exception e){
                	e.printStackTrace();
                }
            }
    }
    
    public void contextInitialized (ServletContextEvent event) {
        System.out.println ("@@ DaemonListener.contextInitialized. @@");
        //Daemon Thread 시작
        startDaemon();
    }

	//서버 사망시 커넥션 연결을 다 풀어준다.
    public void contextDestroyed (ServletContextEvent event) {
        System.out.println ("@@ DaemonListener.contextDestroyed. @@");
        this.isShutdown = true;
        try{
        	//스레드종료 한 뒤 다음을 실행시키도록 join.
        	thread.join();
            thread = null;
        }
        catch (InterruptedException ie)
        {
            ie.printStackTrace();
        }
    }

 

추가내용 작성 예정입니다~

반응형