ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Thread] Daemon Thread
    java/Thread 2021. 5. 27. 22:03

    데몬 스레드는 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

    일반 스레드가 모두 종료되면 데몬 스레드는 자동 종료된다. 일반 스레드의 보조역할을 수행하므로 일반 스레드가 없으면 존재의미가 없기 때문이다.

     

    데몬 스레드- 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동갱신 등이 있다.

     

    데몬 스레드는 일반 스레드의 작성방법과 실행방법이 같으며 스레드를 생성한 후 실행전에 setDaemon(true)를 호출하기만 하면 된다. 

     

    데몬 스레드가 생성한 스레드는 자동적으로 데몬 스레드가 된다.

     

    스레드가 데몬 스레드인지 일반 스레드인지 확인하는 메서드 스레드참조변수.isDaemon() -> boolean리턴


    데몬 스레드는 무한루프와 조건문을 이용하여 실행 후 대기하고 있다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.

     

    public class DaemonThreadTest implements Runnable  {
    	static boolean autoSave = false;
    
    	public static void main(String[] args) {
    		Thread t = new Thread(new DaemonThreadTest());
            
    		t.setDaemon(true); 
            // 이 부분이 없으면 메인 스레드가 종료되어도 이 스레드는 종료되지 않는다.
            
    		t.start();
    
    		for(int i=1; i <= 10; i++) {
    			try{
    				Thread.sleep(1000);
    			} catch(InterruptedException e) {}
    			System.out.println(i);
    			
    			if(i==5)
    				autoSave = true;
    		}
    
    		System.out.println("프로그램을 종료합니다.");
    	}
    
    	public void run() {
    		while(true) {
    			try { 
    				Thread.sleep(3 * 1000);	// 3초마다
    			} catch(InterruptedException e) {}	
    				
    			if(autoSave) { //// autoSave의 값이 true이면 autoSave()를 호출한다.
    				autoSave();
    			}
    		}
    	}
    
    	public void autoSave() {
    		System.out.println("작업파일이 자동저장되었습니다.");
    	}
    }

    결과

    1
    2
    3
    4
    5
    작업파일이 자동저장되었습니다.
    6
    7
    8
    작업파일이 자동저장되었습니다.
    9
    10
    프로그램을 종료합니다.


    isDaemon(true)를 설정하지 않으면 10초가 지나도 메인스레드는 종료되었지만(프로그램을 종료합니다)

    생성한 스레드 t는 영원히 돌게 된다.

     

    1
    2
    3
    4
    5
    작업파일이 자동저장되었습니다.
    6
    7
    8
    작업파일이 자동저장되었습니다.
    9
    10
    프로그램을 종료합니다.
    작업파일이 자동저장되었습니다. //종료되지 않은 우리가 돌리고 있는 스레드
    작업파일이 자동저장되었습니다.
    작업파일이 자동저장되었습니다.
    작업파일이 자동저장되었습니다.
    작업파일이 자동저장되었습니다.


    setDaemon()메서드는 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.

     

    댓글

Designed by Tistory.