멀티스레드 애플리케이션에서는 각 스레드에 우선순위(priority)가 할당됩니다. 스레드 스케줄러(Thread Scheduler)는 이 우선순위를 기준으로 프로세서를 배분하며, 일반적으로 우선순위가 가장 높은 스레드부터 먼저 CPU를 사용할 기회를 얻습니다. 스레드의 기본 우선순위는 5이며, Thread 클래스가 제공하는 getPriority() 메서드를 통해 현재 우선순위를 확인할 수 있습니다.
Thread 클래스에 정의된 세 가지 우선순위 상수
Java의 Thread 클래스에는 스레드 우선순위를 나타내는 다음 세 가지 정적(static) 상수가 정의되어 있습니다.
- MAX_PRIORITY — 스레드가 가질 수 있는 최대 우선순위로, 값은 10입니다.
- NORM_PRIORITY — 기본(default) 우선순위로, 값은 5입니다.
- MIN_PRIORITY — 최소 우선순위로, 값은 1입니다.
문법
public final int getPriority()
우선순위를 변경할 때는 setPriority(int newPriority) 메서드를 사용합니다. 이때 전달하는 값은 반드시 MIN_PRIORITY(1)부터 MAX_PRIORITY(10) 사이여야 하며, 범위를 벗어나면 IllegalArgumentException이 발생합니다.
예제 코드
public class ThreadPriorityTest extends Thread {
public static void main(String[] args) {
ThreadPriorityTest thread1 = new ThreadPriorityTest();
ThreadPriorityTest thread2 = new ThreadPriorityTest();
ThreadPriorityTest thread3 = new ThreadPriorityTest();
System.out.println("thread1의 기본 우선순위: " + thread1.getPriority());
System.out.println("thread2의 기본 우선순위: " + thread2.getPriority());
System.out.println("thread3의 기본 우선순위: " + thread3.getPriority());
thread1.setPriority(8);
thread2.setPriority(3);
thread3.setPriority(6);
System.out.println("thread1의 새로운 우선순위: " + thread1.getPriority());
System.out.println("thread2의 새로운 우선순위: " + thread2.getPriority());
System.out.println("thread3의 새로운 우선순위: " + thread3.getPriority());
}
}
실행 결과
thread1의 기본 우선순위: 5 thread2의 기본 우선순위: 5 thread3의 기본 우선순위: 5 thread1의 새로운 우선순위: 8 thread2의 새로운 우선순위: 3 thread3의 새로운 우선순위: 6
우선순위 사용 시 주의할 점
스레드 우선순위는 JVM과 운영체제에 전달하는 힌트(hint)일 뿐이라는 점을 기억해야 합니다. 실제 실행 순서는 운영체제의 스케줄링 정책에 따라 달라질 수 있으며, 특정 OS에서는 우선순위가 거의 무시되기도 합니다. 또한 높은 우선순위의 스레드가 CPU를 독점하면 낮은 우선순위 스레드가 실행 기회를 얻지 못하는 기아(starvation) 현상이 발생할 수 있으므로, 프로그램의 정확성은 우선순위가 아닌 동기화와 설계에 의존하는 것이 바람직합니다.