[Java][Thread] 쓰레드의 우선순위

2022. 6. 30. 12:12JAVA/Language

1. 쓰레드의 우선순위는 무엇인가?

쓰레드는 우선순위(priority)라는 속성을 가지고 있는데 우선순위가 높을수록 해당 쓰레드는 더 많은 작업 시간을 갖을 수 있습니다. 예를 들어 파일 전송 기능이 있는 메신저의 경우, 파일 다운로드를 처리하는 쓰레드보다 채팅내용을 전송하는 쓰레드의 우선순위가 더 높아야 사용자가 채팅하는데 불편함이 없을 것입니다.

 

쓰레드의 우선순위 정하기

void setPriority(int new Priority) : 쓰레드의 우선순위를 지정한 값으로 변경
int  getPrioirty()                 : 쓰레드의 우선순위를 반환

public static final int MAX_PRIORITY = 10; // 최대 우선순위
public static final int MIN_PRIORITY = 1;  // 최소 우선순위
public static final int NORM_PRIORITY = 5; // 보통 우선순위

쓰레드가 가질수 있는 우선순위의 범위는 1~10이며 숫자가 높을수록 우선순위가 높습니다.

 

다음 예제는 두개의 쓰레드 인스턴스를 생성한 다음 우선순위를 다르게 주어서 작업을 수행한 예제입니다.

public class MyThread implements Runnable{
	private String s;
	
	public MyThread(String s) {
		this.s = s;
	}

	@Override
	public void run() {
		for(int i=0;i<300;i++)
		{
			System.out.print(s);
			for(int x=0;x<1000000;x++);
		}
	}
	
}
public class Driver {

	public static void main(String[] args) {
		Thread t1 = new Thread(new MyThread("-"));
		Thread t2 = new Thread(new MyThread("*"));
		
		t2.setPriority(7);
		
		System.out.println("Priority of t1 (-) : " + t1.getPriority());
		System.out.println("Priority of t2 (*) : " + t2.getPriority());
		
		t1.start();
		t2.start();
	}

}
Priority of t1 (-) : 5
Priority of t2 (*) : 7
*-***********************************************************************************************************************************************************************************************************************************************************************************************************-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

위 수행결과를 보면 우선순위가 높은 t2(*)가 먼저 수행된 것을 볼 수 있습니다.

 

쓰레드의 우선순위에 따른 할당되는 시간의 차이

  • 싱글코어로 두개의 쓰레드로 두개의 작업을 실행한다고 가정하고 한 쓰레드의 우선순위를 더 높게 설정해줬을때의 결과는 우선순위가 높은 쓰레드가 더 빨리 작업을 완료하게 됩니다.
  • 그러나 멀티코어로 위와 같은 조건으로 실행했을때의 결과는 차이가 미미합니다.

위와 같이 멀티코어에서 쓰레드간의 우선순위를 차등을 주어 수행함에도 차이가 미미한 이유는 멀티코어라 해도 OS마다 다른 방식으로 스케줄링하기 때문에 어떤 OS에서 실행하느냐에 따라 다른 결과를 얻을 수 있기 때문입니다.

 

차라리 쓰레드에 우선순위를 부여하는 대신 작업에 우선순위를 두어 PrioirtyQueue에 저장해놓고, 우선순위가 높은 작업이 먼저 처리되도록 하는 것이 더 나을 수 있습니다.

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch13
[도서] Java의 정석, 남궁 성 지음