쓰레드의 우선순위와 데몬 쓰레드

김민성·2022년 7월 14일
0

Java

목록 보기
34/47
post-thumbnail

쓰레드의 우선순위와 데몬 쓰레드

쓰레드의 우선순위

쓰레드는 우선순위(priority) 라는 속성을 가지고 있어서, 작업의 중요도에 따라 특정 쓰레드가 더 많은 작업 시간을 갖도록 한다.

우선순위는 1부터 10까지의 정수로 나타내며, 숫자가 높을수록 우선순위가 높다. (기본값 5)

쓰레드의 우선순위는 그 쓰레드를 생성한 쓰레드로부터 상속받는다. 예를 들어, 우선순위가 5인 main 메서드 안에 생성하는 쓰레드의 우선순위는 자동으로 5가 된다.

.setPriority(int priority);	// 우선순위를 지정값으로 변경
.getPriority()	// 우선순위 반환

위의 메서드로 우선순위를 지정할 수 있다.

하지만 어디까지나 우선실행의 확률이 높아질 뿐, 확실하게 우선된다고 보장되진 않는다.

데몬 쓰레드 (daemon thread)

데몬 쓰레드는 일반 쓰레드의 작업을 돕는 보조 쓰레드이다.

일반 쓰레드가 종료되면 그 존재의미가 없어져 같이 종료되며, 가비지 컬렉터, 자동저장, 화면자동갱신 등이 있다.

데몬 쓰레드는 무한루프와 조건문을 이용해 특정 조건에 작업을 수행한 후 대기하도록 만든다.

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

.isDaemon();	// 데몬쓰레드인지 확인. 맞다면 true
.setDaemon(boolean on)	// true를 넘기면 데몬쓰레드로 변환
public class Main implements Runnable{
    static boolean autoSave = false;

    public static void main(String[] args) {
        Thread t = new Thread(new Main());
        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(3000);
            }catch (InterruptedException e){ }

            if (autoSave){
                autoSave();
            }
        }
    }

    public void autoSave(){
        System.out.println("자동저장 되었습니다.");
    }
}

/*
출력 결과
1
2
3
4
5
자동저장 되었습니다.
6
7
8
자동저장 되었습니다.
9
10
프로그램 종료!
*/

3초마다 autoSave 의 상태를 확인해 true 이면 자동저장을 하는 코드이다.

자동저장을 하는 메서드인 autoSave()는 무한루프인데, 이 쓰레드가 데몬 쓰레드로 만들어졌기 때문에 영원히 반복하지 않고 main 쓰레드가 종료되는 시점에 종료될 수 있는 것이다.

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

0개의 댓글