Programming/JAVA

JAVA 스레드의 우선순위

khj1999 2024. 10. 22. 21:38

자바에서 스레드의 우선순위(Priority)는 스레드가 CPU를 얼마나 자주 할당받을지를 결정하는 중요한 요소이다.
각 스레드는 1부터 10까지의 우선순위를 가지며, 이 값은 Thread 클래스의 상수로 정의되어 있다.
우선순위는 운영체제가 스레드 스케줄링을 결정하는 데 영향을 줄 수 있지만, 자바는 우선순위의 정확한 동작을
보장하지 않는다. 쉽게 설명하면 우선순위를 추천을 한다고 ****생각하면 좋을것 같다.

스레드 우선순위의 상수

  • Thread.MIN_PRIORITY (1): 가장 낮은 우선순위.
  • Thread.NORM_PRIORITY (5): 기본 우선순위. 새로 생성된 스레드는 이 우선순위를 가진다(Default).
  • Thread.MAX_PRIORITY (10): 가장 높은 우선순위.

우선순위 설정 방법

스레드의 우선순위는 setPriority(int newPriority) 메서드를 사용하여 설정할 수 있다.
아래는 우선순위를 설정하는 예시이다.

class MyThread extends Thread {
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 실행 중");
    }
}

public class PriorityExample {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t1.setPriority(Thread.MIN_PRIORITY); // 1
        t2.setPriority(Thread.NORM_PRIORITY); // 5
        t3.setPriority(Thread.MAX_PRIORITY); // 10

        t1.start();
        t2.start();
        t3.start();
    }
}

// 실행 결과 1
Thread-0 실행 중
Thread-1 실행 중
Thread-2 실행 중

// 실행 결과 2
Thread-2 실행 중
Thread-0 실행 중
Thread-1 실행 중

// 결과를 보면 알 수 있듯이 정확한 우선순위에 따라 동작하지 않는다.

우선순위의 작동 원리

  1. 스케줄링: 자바의 스레드 우선순위는 주로 스레드 스케줄링 알고리즘에 영향을 미친다.
    높은 우선순위를 가진 스레드는 낮은 우선순위를 가진 스레드보다 CPU를 더 자주 할당받을 가능성이 높다.
  2. 운영체제 의존성: 스레드의 우선순위는 운영체제에 따라 다르게 처리될 수 있다.
    어떤 운영체제에서는 우선순위에 따라 스레드를 실행할 수 있지만
    다른 운영체제에서는 우선순위가 큰 영향을 미치지 않을 수 있다.
  3. 스케줄링 정책: 자바에서는 스레드의 우선순위를 직접적으로 보장하지 않는다.
    즉, 스레드의 우선순위가 반드시 그 스레드가 더 자주 실행되도록 보장되지 않으며,
    이는 사용 중인 JVM 및 운영체제의 스케줄링 정책에 따라 다를 수 있다.

JVM과 운영체제의 상호작용

  • 자바 Virtual Machine(JVM)은 운영체제와의 상호작용에 따라 스레드 스케줄링을 처리합다.
    JVM이 스레드를 생성하고 관리할 때, 그 동작은 기본적으로 호스트 운영체제의 스레드 모델을 따른다.
  • 예를 들어, 리눅스에서 실행되는 JVM은 리눅스의 스레드 스케줄링 정책을 따르며
    Windows에서 실행되는 JVM은 Windows의 스케줄링 정책을 따른다.

예외 사항

  • 우선순위는 모든 스레드에 대해 반드시 적용되는 것이 아니며, 일부 스레드는 기본값인 NORM_PRIORITY를 유지할 수 있다.
  • 자바의 스레드 모델은 다수의 스레드가 동시에 실행될 수 있는 환경을 고려하여 설계되었기 때문에
    스레드의 우선순위가 실제로 수행 성능에 큰 차이를 만들지는 않을 수 있다.

결론

  • 스레드의 우선순위는 자바에서 스레드의 CPU 할당 빈도를 조정하는 데 사용되지만
    그 효과는 운영체제의 스케줄링 정책에 따라 달라질 수 있다.
  • 스레드를 효율적으로 관리하기 위해 우선순위를 적절하게 설정하는 것이 중요하지만
    너무 의존해서는 안 됩니다. 스레드의 동기화와 협력도 고려해야 한다.

여담

운영체제에 구애 받지 않기 위해서 JVM을 사용하는 것으로 알고 있어서 운영체제에 상관이 없을 줄 알았는데
알아보니 JVM은 스레드 스케줄링을 운영체제의 스레드 스케줄링 정책을 따르는 것을 알게 되었다.