본문 바로가기

Programming/JAVA

멀티 스레드(3) - 스레드 우선순위 2

JAVA logo image

 

 

 

 

 

앞서서 살펴본 스레드 스케줄링은 두 가지 방식이 있습니다. (1) 우선순위 (Priority) 방식과 (2) 순환 할당(Round-Robin)이죠. 우선순위 방식은 말 그대로, 할당된 우선 순위에 따라 우선순위가 높은 스레드가 실행 상태를 더 많이 가져가는 것입니다. 순환 할당 방식은 시간 할당량(Time Slice)을 배분하고 정해진 시간만큼 실행한 다음 다시 다른 스레드를 실행하는 방식을 의미합니다. 

 

여기서 우선순위 방식은 직접 우선순위 부여가 가능하므로 직접 코드로 제어가 가능하지만, 순환 할당 방식은 가상 머신에 의해 컨트롤되고 정해지는 방식으로 코드 제어가 불가능하다는 점을 기억해야 합니다. 

 

 

 


 

 

 

우선순위는 1~10까지 부여됩니다. 주의할 점은 우선순위는 10이 가장 높고, 1이 가장 낮다는 점입니다. 디폴트 우선순위는(따로 지정하지 않을 경우) 기본적으로 5를 부여받게 됩니다. 여기서 말하는 우선순위는 Thread 클래스의 setPriority( ) 메서드를 통해서 설정하게 됩니다. 

 

파라미터로 직접 우선순위 값을 넣을수도 있지만, 가독성을 위해서 Thread 클래스의 상수를 사용할 수 있습니다. 

 

thread.setPriority(우선순위);

thread.setPriority(Thread.MAX_PRIORITY);	// 10
thread.setPriority(Thread.NORM_PRIORITY);	// 5
thread.setPriority(Thread.MIN_PRIORITY);	// 1

 

 

개념을 다시 한번 짚어본다면, 싱글코어일 경우 동시성으로 실행하기 때문에 같은 계산작업을 하는 경우 우선순위가 높은 스레드가 계산작업을 더 빨리 끝냅니다. 더 많은 실행기회를 갖기 때문이죠. 

 

한편 쿼드코어일 경우, 4개의 스레드가 병렬성으로 실행 가능합니다. 그래서 4개 이하의 스레드를 실행할 때 우선순위는 크게 의미가 없죠(5개 이상의 스레드가 실행되어야 우선순위의 영향이 발생)

 

아래 예제에서 스레드를 10개 생성하고, 20억번의 루프를 누가 더 빨리 끝내는지 체크해 보았습니다. Thread10의 우선순위를 높이(MAX)주고, 나머지 Thread1~9는 우선순위를 낮게(MIN) 주었습니다. 

 

//CalcThread.java
public class CalcThread extends Thread{
	public CalcThread(String name) {
		setName(name);
	}
	
	public void run() {
		for(int i=0; i<2000000000; i++) {
		}
		System.out.println(getName());
	}
}

 

import java.awt.Toolkit;

public class ExampleMain {
	public static void main(String[] args) {
		for(int i=1; i <= 10; i++) {
			Thread thread = new CalcThread("thread"+i);
			if(i != 10) {
				thread.setPriority(Thread.MIN_PRIORITY);
			} else {
				thread.setPriority(Thread.MAX_PRIORITY);
			}
			thread.start();
		}
	}
}

/* 출력
thread10
thread4
thread5
thread8
thread3
thread2
thread1
thread6
thread7
thread9
*/