자바 - 스레드 우선순위

안녕하세요, 미래의 자바 마법사 여러분! 오늘은 자바에서 흥미로운 스레드 우선순위의 세계에 빠지게 될 것입니다. 자리 잡고, 자바 실력자에서 스레드 우선순위 전문가로 변신할 여정에 떠날 준비를 하세요!

Java - Thread Priority

스레드 우선순위란?

자세히 들어가기 전에 기본적인 것부터 시작해 보겠습니다. 여러분이 바쁜 주방의 셰프라고 상상해 보세요 (이것이 우리의 자바 프로그램입니다), 여러 작업(우리의 스레드)을 완료해야 합니다. 일부 작업은 다른 작업보다 더 긴급하지 않나요? 바로 이것이 자바에서 스레드 우선순위의 의미입니다 - 자바 가상 기계(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