[Java] 멀티 스레드의 우선순위 결정하기 (setPriority)

멀티 스레드란?

멀티스레드란 응용 프로그램 실행 시 동시에 다수의 처리를 병행하기 위하여, 여러 개의 처리 단위인 스레드를 생성하여 운영하는 방법을 말합니다. 멀티 스레드는 동시성 또는 병렬성으로 실행됩니다. 동시성이란 머맅 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질을 말하고 병렬성은 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질을 말합니다. 싱글 코어 CPU를 이용한 멀티 스레드 작업은 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가며 실행하는 동시성 작업입니다.

 

 멀티 스레드의 우선순위 정하기 

멀티스레드의 순서를 정하는 것을 스레드 스케줄링(thread scheduling)이라고 합니다. 스레드 스케줄링 방식에는 우선순위(priority)방식과 순환 할당(Round-Robin)방식이 있습니다.

 

우선순위 방식 : 우선 순위 방식은 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링 하는 것을 말하며 setPriority()메소드를 사용하여 우선순위를 설정합니다.

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

 

위와 같이 순환 할당방식은 스레드가 사용할 시간할당량을 정하고 할당량의 시간만큼 스레드를 실행시키고 또 다른 스레드를 실행시키는 방식입니다. 순환 할당방식은 JVM(자바 가상 기계)에 의해 결정되기 때문에 개발자의 임의로 수정할 수 없습니다. 그래서 멀티 스레드에 우선순위를 부여하기 위해 개발자가 할 수 있는 유일한 방법은 우선순위 방식을 사용하는 것입니다. 우선순위 방식은 말 그대로 어떤 스레드를 우선적으로 처리할지 우선순위를 부여하는 방식입니다. 우선순위는 1에서 10까지 부여할 수 있고 1이 가장 낮고 10이 가장 높습니다.

 

우선순위는 Thread 클래스의 setPriority() 메소드로 간단히 부여할 수 있습니다.

thread.setPriority(1~10);
thread.setPriority(Thread.MIN_PRIORITY);
thread.setPriority(Thread.NORM_PRIORITY);
thread.setPriority(Thread.MAX_PRIORITY);

위에 보이는 것처럼 우선순위는 숫자로 지정하는 방법이 있고 Thread 클래스의 상수를 쓸 수도 있습니다. MIN_PRIORITY 는 최소우선순위로서 숫자 1과 동일하며 NORM_PRIORITY는 5, MAX_PRIORITY는 10으로 대체할 수 있습니다.

 

간단한 예제

class MutiThread extends Thread { 
    public MutiThread(String threadName) 
    { 
        this.setName(threadName); 
    }
	
    public void run(){
        for (int i = 0; i < 1000; i++) {//시간을 지연시키기 위함
            int x = 100; x += i; 
            for (int j = 0; j < 10000; j++) { 
                x += j; 
            }
        }
        
        System.out.println(this.getName() + " Thread_Start ");
    }
}

public class Thread_Example {
    public static void main(String[] args) {
        for ( int i = 0; i <= 5; i++){
            Thread thread = new MutiThread("[ Thread " + i + " ]"); //스레드 생성
            if (i == 5) 
                thread.setPriority(Thread.MAX_PRIORITY); //가장 먼저 시작
            else 
                thread.setPriority(Thread.MIN_PRIORITY);
            thread.start();
        }
    }
}

댓글(1)

Designed by JB FACTORY