Java 스레드의 우선순위(Priority)에 대해서 설명하고, setPriority() 함수를 이용하여 우선순위를 변경하는 방법에 대해서 알아보겠습니다.

1. Thread 우선순위(Priority)

스레드 우선순위(Thread Priority)는 스레드 스케줄링에 사용되는 개념입니다.

스레드 스케줄링은 여러 스레드가 동시에 실행될 때 어떤 스레드가 얼마나 자주 실행되는지 결정하는 것인데요, 스레드 우선순위가 높으면 스레드 스케줄링 알고리즘에 의해 다른 스레드보다 자주 실행됩니다. 반대로 우선순위가 낮으면, 다른 스레드보다 적게 실행됩니다.

Thread의 우선순위의 범위는 1부터 10이며, 숫자가 높으면 우선순위가 높아서 더 자주 스케줄링이 됩니다. Thread 클래스는 기본적으로 Min, Normal, Max Priority 값에 대한 상수를 제공합니다.

  • Thread.MIN_PRIORITY = 1
  • Thread.NORM_PRIORITY = 5
  • Thread.MAX_PRIORITY = 10

2. Thread 우선순위 확인

Thread의 우선순위 값은 Thread#getPriority() 함수로 얻을 수 있습니다. 기본적으로 Normal(5)로 설정되어있습니다.

  • Thread.currentThread() : 현재 동작 중인 쓰레드의 객체를 리턴
  • 우선순위가 동일하기 때문에 어떤 쓰레드가 먼저 실행될 지 알 수 없음
public class Example {

    public static void main(String[] args) {

        Thread thread1 = new Thread(() -> {
            System.out.println("Thread 1 priority: " + Thread.currentThread().getPriority());
        });

        Thread thread2 = new Thread(() -> {
            System.out.println("Thread 2 priority: " + Thread.currentThread().getPriority());
        });

        thread1.start();
        thread2.start();
    }
}

Output:

Thread 2 priority: 5
Thread 1 priority: 5

3. Thread 우선순위 변경

Thread의 우선순위는 Thread#setPriority(priority)로 변경합니다.

  • thread1의 우선순위가 매우 높기 때문에, 두개 쓰레드를 순차적으로 실행하면 대부분 thread1이 먼저 실행됨
public class Example {

    public static void main(String[] args) {

        Thread thread1 = new Thread(() -> {
            System.out.println("Thread 1 priority: " + Thread.currentThread().getPriority());
        });

        Thread thread2 = new Thread(() -> {
            System.out.println("Thread 2 priority: " + Thread.currentThread().getPriority());
        });

        thread1.setPriority(Thread.MAX_PRIORITY); // 스레드 1의 우선순위를 가장 높게 설정
        thread2.setPriority(Thread.MIN_PRIORITY); // 스레드 2의 우선순위를 가장 낮게 설정

        thread1.start();
        thread2.start();
    }
}

Output:

Thread 1 priority: 10
Thread 2 priority: 1