JAVA/JAVA Basic

[ JAVA ] 스레드(Thread) 우선순위 설정

IT록흐 2021. 6. 20. 09:03
반응형

스레드(Thread) 우선순위 설정

 

하나의 프로세스는 여러 스레드를 생성하여 처리될 수 있다. 그러나 스레드가 점유할 수 있는 자원은 한정적이다. 여기서 자원이란, CPU와 HEAP 영역의 객체를 의미한다.

 

 

다나와

 

우리는 CPU를 고를 때, 코어와 쓰레드를 고려한다. 코어는 연산처리를 위한 ALU + 레지스터 + 컨트롤러가 합쳐진 모듈을 의미한다. 한 개의 코어는 한 개의 스레드를 처리한다. 여기서 문제가 생긴다.

 

 

 

일반적으로 1개의 코어에 1개의 ALU가 할당되므로 자원이 한정적이다. 위 그림을 기준으로 봤을 때, 쓰레드가 4개가 넘어간다면 CPU가 가진 코어로는 모든 쓰레드를 감당할 수 없다. 그러므로 어떤 스레드를 우선 처리할 것인지 정해야 하는데 이것을 '스레드 스케줄링'이라 부른다. 스레드 스케줄링에는 기본적으로 두 가지가 있다.

 

 

1. 우선순위(Priority) 방식

2. 순환할당(Round-Robin) 방식

 

 

우선순위 방식은 스레드에 우선순위를 부여하여 처리하는 방식이다. 그러므로 개발자가 스레드별로 우선순위를 직접 설정할 수 있다. 반대로 순환할당방식은 스레드들에게 우선순위 없이 '정해진 시간'만큼 공평히 코어를 할당해 주는 것이다. 이는 개발자가 제어할 수없다.

 

그럼 개발자가 제어할 수 있는 우선순위 방식으로 스레드에 우선순위를 부여해보자.

 

 

JAVA API 문서

 

Thread 클래스는 우선순위와 관련된 3 가지  static 필드를 가진다. 우선순위는 1부터 10까지 있다. 1이 가장 낮은 우선순위, 10이 가장 높은 우선순위를 가리킨다. 그러므로 MAX_PRIORITY는 10, MIN_PRIORITY는 1을 의미한다. 그리고 NORM_PRIORITY는 중간인 5를 의미한다.

 

 

< 스레드 클래스 >

package prioritythread;

public class PriorityThread extends Thread {
	
	
	public PriorityThread(String name) {
		setName(name);  // 스레드 이름 설정
	}
	
	@Override
	public void run() {
		
		for(int i =0; i<2000000000;i++) {} // 반복작업
		System.out.println("스레드 처리완료 : "+ getName()); //작업 완료후 출력
	}
}

 

< Main 클래스 >

package prioritythread;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		for(int i =1; i<=10;i++) {
			Thread thread = new PriorityThread("Thread"+i);
			
			if(i==10) {
				thread.setPriority(Thread.MAX_PRIORITY); // 가장 높은 우선순위
			}
			else {
				thread.setPriority(Thread.MIN_PRIORITY); // 가장 낮은 우선순위
			}
			thread.start();
		}
	}
}

 

<출력결과>

 

 

 

for문으로 Thread10이 가장 늦게 생성되어 실행되었지만, 스레드 우선순위가 가장 높아 Thread10 먼저 출력 되었음을 알수 있다. 두 번째 자원관리로 '공유객체'가 있다. 공유객체는 '동기화'와 관련있는데, 다음 포스팅에서 이어가겠다.

 

반응형