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 실행 중
// 결과를 보면 알 수 있듯이 정확한 우선순위에 따라 동작하지 않는다.
우선순위의 작동 원리
- 스케줄링: 자바의 스레드 우선순위는 주로 스레드 스케줄링 알고리즘에 영향을 미친다.
높은 우선순위를 가진 스레드는 낮은 우선순위를 가진 스레드보다 CPU를 더 자주 할당받을 가능성이 높다. - 운영체제 의존성: 스레드의 우선순위는 운영체제에 따라 다르게 처리될 수 있다.
어떤 운영체제에서는 우선순위에 따라 스레드를 실행할 수 있지만
다른 운영체제에서는 우선순위가 큰 영향을 미치지 않을 수 있다. - 스케줄링 정책: 자바에서는 스레드의 우선순위를 직접적으로 보장하지 않는다.
즉, 스레드의 우선순위가 반드시 그 스레드가 더 자주 실행되도록 보장되지 않으며,
이는 사용 중인 JVM 및 운영체제의 스케줄링 정책에 따라 다를 수 있다.
JVM과 운영체제의 상호작용
- 자바 Virtual Machine(JVM)은 운영체제와의 상호작용에 따라 스레드 스케줄링을 처리합다.
JVM이 스레드를 생성하고 관리할 때, 그 동작은 기본적으로 호스트 운영체제의 스레드 모델을 따른다. - 예를 들어, 리눅스에서 실행되는 JVM은 리눅스의 스레드 스케줄링 정책을 따르며
Windows에서 실행되는 JVM은 Windows의 스케줄링 정책을 따른다.
예외 사항
- 우선순위는 모든 스레드에 대해 반드시 적용되는 것이 아니며, 일부 스레드는 기본값인
NORM_PRIORITY
를 유지할 수 있다. - 자바의 스레드 모델은 다수의 스레드가 동시에 실행될 수 있는 환경을 고려하여 설계되었기 때문에
스레드의 우선순위가 실제로 수행 성능에 큰 차이를 만들지는 않을 수 있다.
결론
- 스레드의 우선순위는 자바에서 스레드의 CPU 할당 빈도를 조정하는 데 사용되지만
그 효과는 운영체제의 스케줄링 정책에 따라 달라질 수 있다. - 스레드를 효율적으로 관리하기 위해 우선순위를 적절하게 설정하는 것이 중요하지만
너무 의존해서는 안 됩니다. 스레드의 동기화와 협력도 고려해야 한다.
여담
운영체제에 구애 받지 않기 위해서 JVM을 사용하는 것으로 알고 있어서 운영체제에 상관이 없을 줄 알았는데
알아보니 JVM은 스레드 스케줄링을 운영체제의 스레드 스케줄링 정책을 따르는 것을 알게 되었다.