Programming/Process & Multi Threading

[Java] 스레드의 우선순위(Thread Priority)

dev.pudding 2023. 12. 15. 23:48
728x90

스레드 스케줄러와 CPU의 관계

https://www.boardinfinity.com/blog/thread-priority-in-java-what-is-it/

  1. 스레드 스케줄러는 JVM에서 관리되며, 프로세스와 CPU사이에서 어떤 스레드가 우선적으로 CPU에 의해 실행될지 결정하는 역할을 한다.
  2. 스레드를 동시성(Concurrency)으로 실행시키는 주체는 스레드 스케줄러이다. 스레드 여러개를 동시에 번갈아가면서 실행시켜서 마치 동시에 실행되는 것처럼 보이게 해준다.
  3. 동시성 스레드 예시(시분할 알고리즘 , Time-slicing algorithm)

https://java-jedi.medium.com/multithreading-threads-and-processes-time-slicing-algorithm-547be0732b5f

4. 스레드 스케줄러는 단일 프로세서 시스템에서 여러 스레드 간에 실행을 조절하는 역할을 한다. 스레드 간에 번갈아가면서 실행되어 동시성을 제공하지만, 이는 하나의 코어에서 이루어지는 것이다.

5. 반면에 병렬성은 여러 코어 또는 프로세서에서 동시에 작업이 처리되기 때문에, 스레드 스케줄러가 아니라 운영 체제 또는 병렬 프로그래밍 기술이 각 코어 또는 프로세서에 작업을 할당하고 관리한다. ( 즉, 스레드 스케줄러와 병렬프로그램은 관련없다)

스레드 우선순위

  1. 모든 스레드에 1부터 10까지의 우선순위를 준다 (1:MIN_PRIORITY, 10:MAX_PRIORITY)
    1.1 숫자가 높을 수록 스레드의 우선순위가 높은 것이다.
  2. 순위가 없다면 디폴트 순위는 5로 정해진다.
  3. 스레드에 우선순위가 동일하다면 선입선출(FIFO:first-in-first-out)에 의해 스레드의 순위가 매겨진다 (스레드 스케줄러는 queue 자료구조로 스레드를 저장하기 때문이다)
  4. 스레드의 실행순서는 OS와 JVM의 스케줄링 정책에 따라 다를 수 있으며, 절대적인 실행순서를 보장하지 않는다
class Worker implements Runnable{ //사용자정의 워커스레드
	@Override
    public void run(){
    	for(int i=0;i<10;i++){
        	System.out.println("Worker스레드");
        }
    }
}

public class App{
	public static void main(String[] args){
		//메인스레드의 우선순위를 5로 설정    
    	Thread.currentThread.setPriority(5);
        
        //t1의 우선순위를 10으로 설정 
        Thread t1 = new Thread(new Worker());
        t1.setPriority(10); 
        t1.start();
        
        //실행스레드 출력 
        System.out.println(Thread.currentThread().getName());
    }
}

 

실행결과

main 스레드가 더 먼저 표시되었다.

 

결론

 메인스레드는 우선순위를 5로 부여하고  워커스레드는 우선순위를 10으로 설정하여 워커스레드에 더 높은 우선순위를 부여하였는데, 메인스레드가 더 빠르게 실행되었다. 왜냐하면 메인스레드는 자바의 엔트리 포인트(Entry Point)이기 때문에 JVM이 실행되면 무조건적으로 가장 먼저 실행된다. 따라서 개발자가 아무리 우선순위를 낮게 설정하더라도 무시된다.

 

스레드의 우선순위는 OS와 JVM의 정책에 의해 결정되며 절대적인 실행순서를 보장하지 않는다.  자바에서는 스레드 우선순위는 거의 사용하지 않는 방법이며 JVM은 스레드 스케줄링을 처리하고 충분히 신뢰할 수 있도록 구현되어있다. 

스레드 우선순위를 개발자가 조절하는 경우, 일부 스레드가 실행되지 않는 "스레드 기아(thread starvation)" 현상이 나타날 수 있다. 

따라서 우선순위를 조절할 때는 특별한 상황이 아닌 이상 스레드 스케줄링 메커니즘에 의존하는 것이 바람직하다.