Back-end/이것이 자바다[신용권 한빛미디어]

스레드 우선순위

Ho's log 2021. 11. 27. 19:42

멀티 스레드는

동시성(Concurrency) 

병렬성(Parallelism) 으로 실행

 

 

동시성

멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질

 

병렬성

멀티 작업을 위해 멀티 코어에서 개별스레드를 동시에 실행하는 성질

 

싱글 코어 CPU를 이용한 멀티 스레드 작업은 

병렬적으로 실행되는 것 처럼 보이지만

사실은 번갈아가며 실행하는 동시성 작업이다. 번갈아 실행하는 것이 워낙 빠르다 보니 병렬성으로 보일 뿐

 

 

스레드의 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 결정

이것을 스레드 스케줄링 

스레드 스케줄링에 의해 스레드들은 아주 짧은 시간에 번갈아 가면서 그들의 run() 메소드를 조금씩 실행 

 

 

자바의 스레드 스케줄링은 우선순위(Priority) 방식순환 할당 (Round-Robin) 방식을 사용한다

 

우선 순위 방식은 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링 하는것 

우선순위 방식은 스레드 객체에 우선 순위 번호를 부여할수 있기 때문에 개발자가 코드로 제어 할수 있다. 

우선 순의 방식에서 우선순위는 1에서부터 10부터 까지 부여되는데, 1이 가장 우선 순위가 낮고 ,  10이 가장 높다.

우선 순의를 부여하지 않으면 모든 스레드들은 기본적으로 5의 우선순위를 할당받는다.

만약 우선순위를 변경하고 싶다면 Thread 클래스가 제공하는 setPriorirty() 메소드를 이용

thread.setPriority(우선순위);

 

우선순의의 매개값으로 1-10 까지의 값을 직접 줘도 되자만 ,

코드의 가독성(이해도)를 높이기 위해 Thread 클래스의 상수를 사용할수도 있다.

 

thread.setPriorty(Thread.MAX_PRIORITY);
thread.setPriorty(Thread.MIN_PRIORITY);
thread.setPriorty(Thread.NORM_PRIORITY);

 

MAX_PRIORITY는 10,

NORM_PRIORTY는 5,

MIN_PRIORTY는 1, 

의 값을 가지고 있다.

 

다른 스레드에 실행 기회를 더 많이 가지려먼 MAX_PRIORTY로 우선순위를 높게 설정하면 된다

 

동일한 계산 작업을 하는 스레드들이 있고, 싱글 코어에서 동시성으로 실행 

우선순위가 높은 스레드가 실행 기회를 더 많이 가지기 때문에 

우선순위가 나는 스레드보다 계산 작업을 빨리 끝낸다.

 

쿼드 코어 일 경우에는 4개의 스레드가 병렬성으로 실행될 수 있기 때문에 4개 이하의 스레드를 실행 할 경우에는 우선순의 방식이 크게 영향을 미치지 못한다.

 

최사한 5개 이상의 스레드가 실행되어야 우선순위의 영향을 받는다.

 

10개의 스레드를 생성하고 20억번의 루핑을 누가 더 빨리 끝내는 가를 테스트 예제

Thread1-9 는 우선순의를 가장 낮게 주었고 

Thread10은 우선순위를 가장 높게 주었다.

결과는 Thread 10의 계산 작업이 가장 빨리 끝난다.

public class CalcThread extends Thread {

	public CalcThread(String name ){
    	setName(name);
    }
    
    public void run(){
    
    	for(int i = 0; i<200000000; i++){
        
        
        }

		System.out.println(getName());
	}
    
}

 

public class PriorityExample{


	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();
        
        }
    
    }


}

 

 

 

순환 할당 방식은 시간할당량(Time Slice) 을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행하는 방식을 말한다.

순환 할당 방식은 자바 가상 기계에 의해서 정해지기 때문에 코드로 제어할 수 없다.

 

 

 

 

 

'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글

스레드 상태  (0) 2021.12.04
동기화 메소드와 동기화 블록  (0) 2021.12.04
작업 스레드 생성과 실행  (0) 2021.11.24
멀티 스레드 개념  (0) 2021.11.22
java.time 패키지  (0) 2021.10.25