쓰레드는 우선순위(priority) 라는 속성을 가지고 있어서, 작업의 중요도에 따라 특정 쓰레드가 더 많은 작업 시간을 갖도록 한다.
우선순위는 1부터 10까지의 정수로 나타내며, 숫자가 높을수록 우선순위가 높다. (기본값 5)
쓰레드의 우선순위는 그 쓰레드를 생성한 쓰레드로부터 상속받는다. 예를 들어, 우선순위가 5인
main메서드 안에 생성하는 쓰레드의 우선순위는 자동으로 5가 된다.
.setPriority(int priority); // 우선순위를 지정값으로 변경
.getPriority() // 우선순위 반환
위의 메서드로 우선순위를 지정할 수 있다.
하지만 어디까지나 우선실행의 확률이 높아질 뿐, 확실하게 우선된다고 보장되진 않는다.
데몬 쓰레드는 일반 쓰레드의 작업을 돕는 보조 쓰레드이다.
일반 쓰레드가 종료되면 그 존재의미가 없어져 같이 종료되며, 가비지 컬렉터, 자동저장, 화면자동갱신 등이 있다.
데몬 쓰레드는 무한루프와 조건문을 이용해 특정 조건에 작업을 수행한 후 대기하도록 만든다.
데몬 쓰레드가 생성한 쓰레드는 자동으로 데몬 쓰레드가 된다.
.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이 발생한다.