멀티쓰레드로 작업을 할 경우 A쓰레드를 B쓰레드보다 우선적으로 작업을 해야할 때가 있다. 예를 들면 카카오톡에서 상대방이 사진을 보내오고 나는 답장을 보낼 경우, 사진을 다운받는 로딩보다 채팅을 보내는 일이 우선되어야 할것이다. 그러면 채팅은 보내지지만 사진을 다운받는 시간은 더 길어질 것이다.
쓰레드는 우선순위라는 속성을 가지고 있어 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다. 우선순위 값이 클수록 더 많은 작업시간을 갖게 되는데, 이처럼 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 지정하여 시간을 할당할 수 있다. 위의 예시처럼 채팅을 보내는 일을 사진을 다운받는 일보다 먼저 실행하고 싶을 경우, 채팅의 우선순위를 더 높게 설정하면 되는 것이다.
쓰레드 우선순위 정하는 법
void setPriority(int newPriority) // 쓰레드의 우선순위를 지정한 값으로 변경하는 메서드
int getPrioirity() // 쓰레드의 우선순위를 반환하는 메서드
public static final int MAX_PRIORITY = 10 // 최대 우선순위
public static final int MIN_PRIORITY = 1 // 최소 우선순위
public static final int NORM_PRIORITY = 5 // 보통 우선순위
- 우선순위의 범위 : 1 ~ 10, 숫자가 클 수록 우선순위가 높다
- 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속 받는다
- main메서드를 수행하는 쓰레드의 우선 순위는 5
우선순위 같을때
class MainThread {
public static void main(String[] args) {
Thread1 th1 = new Thread1();
Thread2 th2 = new Thread2();
System.out.println("th1의 우선순위 : " + th1.getPriority());
System.out.println("th2의 우선순위 : " + th2.getPriority());
th1.start();
th2.start();
}
}
class Thread1 extends Thread {
public void run() {
for(int i=0; i < 100; i++) {
System.out.print("-");
for(int j=0; j < 10000000; j++); // 작업 지연
}
}
}
class Thread2 extends Thread {
public void run() {
for(int i=0; i < 100; i++) {
System.out.print("|");
for(int j=0; j < 10000000; j++);
}
}
}
h1과 th2 모두 main메서드에서 생성하였기때문에 main메서드를 실행하는 쓰레드의 우선순위인 5를 상속받았다.
우선순위가 같을때 할당시간은 똑같으나 실행을 시킬때마다 작업 순서가 달라진다. 왜냐하면 OS에서 결정하는 스케줄링에 따라 작업 순서가 결정되기때문이다.
우선순위 다를때
class MainThread {
public static void main(String[] args) {
Thread1 th1 = new Thread1();
Thread2 th2 = new Thread2();
th2.setPriority(7); // 우선순위 th1 < th2
System.out.println("th1의 우선순위 : " + th1.getPriority());
System.out.println("th2의 우선순위 : " + th2.getPriority());
th1.start();
th2.start();
}
}
class Thread1 extends Thread {
public void run() {
for(int i=0; i < 100; i++) {
System.out.print("-");
for(int j=0; j < 10000000; j++); // 작업 지연
}
}
}
class Thread2 extends Thread {
public void run() {
for(int i=0; i < 100; i++) {
System.out.print("|");
for(int j=0; j < 10000000; j++);
}
}
}
th1과 th2 모두 main메서드에서 생성하였기때문에 main메서드를 실행하는 쓰레드의 우선순위인 5를 상속받았다. 그 다음 th2.setPriority(7)로 th2의 우선순위를 7로 변경하여 우선순위가 th1보다 th2가 높아졌다.
우선순위가 높은 th2의 실행시간이 th1보다 늘어난 것을 알 수 있다. 우선순위가 같은 경우 각 쓰레드에서 거의 같은 양의 실행시간이 주어지지만, 우선순위가 다르다면 우선순위가 높은 th1에게 상대적으로 th2보다 더 많은 양의 실행시간이 주어지고 결과적으로 th2의 작업이 더 빨리 완료될 수 있다. 하지만 멀티코어에서는 쓰레드의 우선순위에 따라 차이가 없다.
출처
JAVA의 정석
'JAVA' 카테고리의 다른 글
[JAVA] 쓰레드 구현방법(Thread 상속 vs Runnable 인터페이스) (0) | 2023.07.16 |
---|---|
[JAVA] 콘솔 입력 방법 (Scanner, InputStream, InputStreamReader, BufferedReader) (0) | 2023.07.13 |
[JAVA] 간단한 콘솔게임 만들기 (기획) (0) | 2023.07.13 |
댓글