8.3.1 스레드의 우선권
스레드의 우선권(Priority)을 어떻게 주느냐에 따라서 스레드의 작업 순서가 달라집니다. 작업 순서가 달라진다는 것은 Runnable 상태에서 얼마나 자주 Run 상태가 될 수 있느냐를 말하는 것입니다. 우선권이 높다면 Run 상태가 될 확률이 높겠죠. 우선권이 높다면 다른 스레드들 보다 작업을 빨리 끝낼 수 있습니다. 스레드에 할당할 수 있는 스레드의 우선권 상수는 다음과 같습니다.
▣ Thread 클래스의 스태틱 우선권 상수
◈ public static final int MIN_PRIORITY = 1;
◈ public static final int NORM_PRIORITY = 5;
◈ public static final int MAX_PRIORITY = 10;
▣ 우선권 문제
◈ 어떠한 스레드가 Run 상태를 많이 차지할 것인가의 문제이다.
스레드의 우선권에 대한 값은 Thread 클래스의 public static final 멤버로 정의되어 있습니다. 스레드의 우선권을 셋팅하기 위해서 1부터 10까지의 수를 사용해도 되며, Thread의 스태틱 우선권 상수변수를 사용해도 됩니다. 우선권을 설정하기 위해서는 다음과 같이 Thread의 setPriority() 메서드를 사용하면 됩니다.
▣ 스레드의 상태 설정하기
◈ PriorityThread t = new PriorityThread();
◈ t.setPriority(1);
◈ //t.setPriority(Thread.MIN_PRIORITY);
◈ //우선권이 가장 낮은 상태
◈ t.setPriority(5);
◈ //t.setPriority(Thread.NORM_PRIORITY);
◈ //일반적인 스레드가 갖는 우선권
◈ t.setPriority(10);
◈ //t.setPriority(Thread.MAX_PRIORITY);
◈ //우선권이 가장 높은 상태
현재 실행중인 스레드의 우선권을 얻고자 한다면 다음과 같이 getPriority()를 사용하면 됩니다.
▣ 스레드에 설정된 우선권 얻어내기
◈ int p = t.getPriority();
▣ 우선권(Priority)
◈ 스레드의 우선권을 설정하기 위해서 setPriority() 메서드를 사용하고, 현재 설정되어 있는 우선권을 얻어내기 위해서 getPriority()를 사용한다.
자! 그럼 이 두 메서드를 이용해서 스레드의 우선권을 변경해 보도록 하겠습니다.
『chap08\PriorityThreadMain.java』
ⓙ───────────────────────────────────────
/**
스레드의 우선권을 테스트하는 예제
**/
class PriorityThread extends Thread {
public void run() {
int i = 0;
System.out.print(this.getName()); //스레드의 이름 출력
System.out.println("[우선권:" + this.getPriority() + "] 시작\t");
while(i < 10000) {
i = i + 1;
try{
this.sleep(1);
}catch(Exception e){System.out.println(e);}
}
System.out.print(this.getName()); //스레드의 이름 출력
System.out.println("[우선권:" + this.getPriority() + "] 종료\t");
}
} //end of PriorityThread class
public class PriorityThreadMain {
public static void main(String[] args) {
System.out.println("Main메서드 시작");
for(int i=1; i<=10; i++){
//for(int i=Thread.MIN_PRIORITY; i<=Thread.MAX_PRIORITY; i++){
PriorityThread s = new PriorityThread();
s.setPriority(i);
s.start();
}
System.out.println("Main메서드종료");
}//end of main
} //end of PriorityThreadMain class
//㉶--------------------------------------------㉳
/***
C:\javasrc\chap08>javac PriorityThreadMain.java
C:\javasrc\chap08>java PriorityThreadMain
Main메서드 시작
Thread-6[우선권:6] 시작
Thread-7[우선권:7] 시작
Thread-8[우선권:8] 시작
Thread-9[우선권:9] 시작
Thread-5[우선권:5] 시작
Thread-10[우선권:10] 시작
Main메서드종료
Thread-3[우선권:3] 시작
Thread-4[우선권:4] 시작
Thread-1[우선권:1] 시작
Thread-2[우선권:2] 시작
Thread-10[우선권:10] 종료
Thread-8[우선권:8] 종료
Thread-9[우선권:9] 종료
Thread-6[우선권:6] 종료
Thread-7[우선권:7] 종료
Thread-5[우선권:5] 종료
Thread-3[우선권:3] 종료
Thread-4[우선권:4] 종료
Thread-1[우선권:1] 종료
Thread-2[우선권:2] 종료
***/
───────────────────────────────────────ⓑ
이 결과는 컴퓨터의 성능에 따라서 약간씩 달라질 수 있습니다. 보다 정확한 결과를 보고자 한다면 while문의 반복횟수를 더 늘려 보시기 바랍니다. 현재의 작업이 단순하기 때문에 반복문을 많이 돌려야만 좋은 결과를 얻을 수 있습니다.
▣ sleep(1)을 사용한 이유(1은 1/1000초를 의미)
◈ sleep(1)을 사용하면 작업을 약간 지연시키는 효과가 있다. 이것은 단순한 작업 처리에서 우선권이 어떻게 변화하는 지를 눈으로 확인할 수 있게 해준다.
우선권을 다르게 주기 위해서 다음과 같이 10개의 스레드를 생성할 때 단계별로 우선권을 설정한 후 실행시키고 있습니다.
▣ 1부터 10까지 우선권 부여
◈ for(int i=1; i<=10; i++){
◈ //for(int i=Thread.MIN_PRIORITY; i<=Thread.MAX_PRIORITY; i++){
◈ PriorityThread s = new PriorityThread();
◈ s.setPriority(i);
◈ s.start();
◈ }
MIN_PRIORITY와 MAX_PRIORITY까지 모든 우선권을 전부 사용해서 스레드를 생성하고 있습니다. 결과는 MAX_PRIORITY를 가진 Thread-9번이 제일 먼저 작업을 끝내고, Thread-0번이 마지막에 작업을 끝내는 것을 볼 수 있습니다. 작업이 단순하기 때문에 약간의 지연효과를 위해서 sleep(1)에서 1/1000초의 시간동안 대기시키고 있습니다. 이로써 스레드의 우선권을 변경하는 방법에 대해서 알아보았습니다.