스레드 우선순위(Priority)와 스케쥴링

kyw·2025년 10월 10일

Java

목록 보기
11/13
package com.multi6.a_thread.thread;

public class Thread3 implements Runnable {
    @Override
    public void run() {
        //delay 코드
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            for (int j = 0; j < Integer.MAX_VALUE; j++) {

            }
        }

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

Thread3.java

  • 이 Runnable 객체는 run() 메서드가 호출되면 매우 오래 걸리는 반복문(delay 코드)을 실행한 후, 자신의 스레드 이름을 출력하는 간단한 작업을 수행한다.

  • 핵심은 이 반복문이 CPU 시간을 상당히 소모하여, 여러 스레드가 동시에 실행될 때 CPU 자원을 차지하기 위해 경쟁하게 만든다는 점이다.



package com.multi6.a_thread.run;

import com.multi6.a_thread.thread.Thread3;

public class Run2 {
    public static void main(String[] args) {

        Thread3 t1= new Thread3();

        for (int i =0; i<=100; i++){
            Thread t2 = new Thread(t1); //기본 우선순위 : 5

            if (i%2==0){
                t2.setPriority(Thread.MAX_PRIORITY); //10
                t2.setName("Thread 짝수 "+i);
            } else {
                t2.setPriority(Thread.MIN_PRIORITY); //1
                t2.setName("Thread 홀수 "+i);
            }

            t2.start();


        }
    }
}

Run2.java

  1. 스레드 101개 생성: for문이 0부터 100까지 돌면서, 총 101개의 스레드를 생성한다. 모든 스레드는 동일한 Thread3 작업(t1)을 공유한다.

  2. 우선순위 설정:

    • i가 짝수일 경우, 생성된 스레드의 우선순위를 가장 높은 Thread.MAX_PRIORITY (10)으로 설정한다.

    • i가 홀수일 경우, 생성된 스레드의 우선순위를 가장 낮은 Thread.MIN_PRIORITY (1)로 설정한다.

    • 스레드의 이름도 짝수/홀수에 따라 구분되도록 setName()으로 지정한다.

  3. 스레드 실행: t2.start()를 통해 생성된 101개의 스레드가 동시에 실행 대기 상태에 들어간다.


실행 결과 예측

  • 우선순위의 역할: 스레드 우선순위는 JVM의 스레드 스케줄러에게 어떤 스레드에게 CPU 자원을 더 많이 할당할지 알려주는 '힌트'다. 우선순위가 높다고 해서 반드시 먼저 끝나는 것을 보장하지는 않지만, 일반적으로 더 많은 실행 기회를 얻게 된다.

  • 예상 출력:
    코드를 실행하면, 우선순위가 10으로 설정된 'Thread 짝수' 스레드들이 우선순위가 1인 'Thread 홀수' 스레드들보다 먼저 작업을 끝내고 이름을 출력할 확률이 매우 높다. 콘솔에는 'Thread 짝수...' 이름들이 먼저 그룹지어 나타나고, 한참 뒤에 'Thread 홀수...' 이름들이 출력될 것이다.


이 코드는 스레드 스케줄링이 확률적이지만, 우선순위가 그 확률에 상당한 영향을 미친다는 것을 보여주는 좋은 학습이다.

profile
作心百日

0개의 댓글