자바 - 스레드 우선순위
안녕하세요, 미래의 자바 마법사 여러분! 오늘은 자바에서 흥미로운 스레드 우선순위의 세계에 빠지게 될 것입니다. 자리 잡고, 자바 실력자에서 스레드 우선순위 전문가로 변신할 여정에 떠날 준비를 하세요!
스레드 우선순위란?
자세히 들어가기 전에 기본적인 것부터 시작해 보겠습니다. 여러분이 바쁜 주방의 셰프라고 상상해 보세요 (이것이 우리의 자바 프로그램입니다), 여러 작업(우리의 스레드)을 완료해야 합니다. 일부 작업은 다른 작업보다 더 긴급하지 않나요? 바로 이것이 자바에서 스레드 우선순위의 의미입니다 - 자바 가상 기계(JVM)에 어떤 스레드가 더 중요하고 더 많은 주의를 받아야 한다는 것을 알려줍니다.
우선순위 스케일
자바에서 스레드 우선순위는 1에서 10까지의 숫자로 표현됩니다:
- 1은 가장 낮은 우선순위
- 5는 정상 우선순위(기본값)
- 10은 가장 높은 우선순위
이를 VIP 명단 있는 화려한 클럽에서 생각해 보세요. 숫자가 높을수록 스레드가 더 중요하게 간주됩니다.
스레드 클래스의 내장 프로퍼티 상수
자바는 일반 우선순위 수준에 대한 편리한 상수를 제공합니다. 살펴보겠습니다:
상수 | 값 | 설명 |
---|---|---|
Thread.MIN_PRIORITY | 1 | 최소 우선순위 |
Thread.NORM_PRIORITY | 5 | 기본 우선순위 |
Thread.MAX_PRIORITY | 10 | 최대 우선순위 |
이러한 상수를 사용하면 코드가 더 가독성이 좋습니다. 손님 명단에 숫자 대신 "VIP", "정상", "경제"를 사용하는 것과 같습니다.
스레드 우선순위 설정 및 가져오기 메서드
이제 스레드 우선순위를 설정하고 가져오는 방법을 배워 보겠습니다:
스레드 우선순위 설정
스레드의 우선순위를 설정하려면 setPriority()
메서드를 사용합니다:
thread.setPriority(Thread.MAX_PRIORITY);
스레드 우선순위 가져오기
스레드의 현재 우선순위를 확인하려면 getPriority()
메서드를 사용합니다:
int priority = thread.getPriority();
자바에서 스레드 우선순위 예제
이 지식을 간단한 예제로 실습해 보겠습니다:
public class PriorityDemo {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 1: " + i);
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 2: " + i);
}
});
// 우선순위 설정
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.MAX_PRIORITY);
// 스레드 시작
t1.start();
t2.start();
}
}
이 예제에서는 두 개의 스레드를 생성합니다. 스레드 1은 최소 우선순위로 설정되고, 스레드 2는 최대 우선순위를 가져갑니다. 이 프로그램을 실행하면 스레드 2가 먼저 시작해도 스레드 1보다 먼저 작업을 완료할 것입니다.
하지만, 스레드 스케줄링은 우선순위 뿐만 아니라 다른 요인에 영향을 받을 수 있으므로 결과가 항상 정확하게 기대한 것과 다를 수 있습니다. 이는 VIP 티켓을 친구들에게 주는 것과 같습니다 - 더 가능성이 높지만 보장되지는 않습니다!
자바에서 스레드 우선순위 더 많은 예제
이해를 더욱 확고히 하기 위해 약간 더 복잡한 예제를 탐구해 보겠습니다:
public class PriorityExample implements Runnable {
private String threadName;
public PriorityExample(String name) {
this.threadName = name;
}
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(threadName + " with priority " +
Thread.currentThread().getPriority() +
" is running");
try {
Thread.sleep(1000); // 1초간 잠자리
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new PriorityExample("Low Priority Thread"));
Thread t2 = new Thread(new PriorityExample("Normal Priority Thread"));
Thread t3 = new Thread(new PriorityExample("High Priority Thread"));
t1.setPriority(Thread.MIN_PRIORITY);
// t2의 우선순위는 기본값이므로 설정하지 않아도 됩니다
t3.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}
이 예제에서는 세 개의 스레드를 다른 우선순위로 생성합니다. 각 스레드는 이름과 우선순위를 세 번 출력하고, 각 출력 사이에 1초씩 쉬게 됩니다.
이 프로그램을 실행하면 다음과 같은 출력이 나올 수 있습니다:
High Priority Thread with priority 10 is running
Normal Priority Thread with priority 5 is running
Low Priority Thread with priority 1 is running
High Priority Thread with priority 10 is running
Normal Priority Thread with priority 5 is running
Low Priority Thread with priority 1 is running
High Priority Thread with priority 10 is running
Normal Priority Thread with priority 5 is running
Low Priority Thread with priority 1 is running
높은 우선순위의 스레드가 먼저 실행되고, 정상 우선순위의 스레드가 그 뒤에, 낮은 우선순위의 스레드가 마지막에 실행되는 것을 볼 수 있습니다. 그러나 정확한 순서는 시스템 부하와 JVM 구현의 세부 사항에 따라 다를 수 있습니다.
결론
그렇게 끝내고, 여러분! 자바 실력을 한 단계 업그레이드하며 스레드 우선순위를 마스터하셨습니다. 스레드 우선순위는 유용한 도구지만, 마법의 지팡이가 아님을 기억하세요. JVM이 결국 스레드를 어떻게 스케줄링할지 결정하며, 우선순위는 그가 고려할 수 있는 많은 요소 중 하나입니다.
스레드 우선순위를 사용하는 것은 좋은 파티 주최자가 되는 것과 같습니다 - 누가 먼저 주의를 받아야 하는지 제안할 수 있지만, 손님들이 어떻게 상호작용할지 완벽히 제어할 수는 없습니다. 우선순위를 지혜롭게 사용하면 자바 프로그램이 유연하게 작동할 것입니다.
코딩을 계속하고, 배우고, 기억하십시오 - 자바의 세계에서는 모든 스레드가 중요합니다!
Credits: Image by storyset