JAVA - 쓰레드의 스케줄링과 쓰레드의 우선순위 컨트롤


이전 포스팅에서 쓰레드의 생성하는 방법에대해

알아보았다. 이번엔 쓰레드의 특성에 관해 알아보자.

쓰레드를 생성할때는 여러개의 쓰레드를 생성할 수 있다.


둘 이상의 쓰레드가 생성될 수 있기때문에 자바 가상머신

(자바 가상머신의 일부로 존재하는 쓰레드 스케줄러)은 쓰레드의

실행을 스케줄링 해야한다. 스케줄링에 사용되는 알고리즘의

기본원칙은 아래와 같다.


1.우선순위가 높은 쓰레드의 실행을 우선한다.

2.동일한 우선순위의 쓰레드가 둘 이상 존재할때는 CPU의

할당시간을 분배해서 실행한다.


자바의 쓰레드에는 우선순위 라는것이 할당된다.

이것은 가상머신에 의해서 우선적으로 실행되어야 하는

쓰레드의 순위를 의미하는 것으로 가장 높은 우선 순위는 정수10으로

가장 낮은 순위는 정수1로 표현한다. 즉 총10단계의

우선순위가 존재하는 것이다. 그리고 이러한 쓰레드의

우선순위는 프로그램상에서 변경 및 확인이 가능하다.


먼저 간단하게 스케줄링의 기본원칙을 위한 소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MessageSendingThread extends Thread{
    String message;
    public MessageSendingThread(String str){
        message = str;
    }
    public void run(){
        for(int i=0; i<1000000; i++)
            System.out.println(message+"("+getPriority()+")");
    }
}
 
class test2{
    public static void main(String[] args){
        MessageSendingThread tr1=new MessageSendingThread("First");
        MessageSendingThread tr2=new MessageSendingThread("Second");
        MessageSendingThread tr3=new MessageSendingThread("Thired");
        tr1.start();
        tr2.start();
        tr3.start();
    }
}
cs



8line에서 getPriority메소드는 Thread클래스의 인스턴스

메소드로 쓰레드의 우선순위를 반환한다.

14~16line에서는 동일한 우선순위의 쓰레드가 생성되었다.

우선순위를 변경하지 않으면 쓰레드의 우선순위는

동일하게 유지된다.


먼저 위 코드를 실행하면 결과값으로


First(5)

First(5)

First(5)

.....

Second(5)

.....

Third(5)

First(5)

..........

Third(5)


위와같이 출력될것이다


위의 결과로인해 처음 쓰레드가 생성되었을 때의

우선순위가 어떻게 되는지 알수있다. 그리고

우선순위가 동일한 쓰레드들이 CPU할당 시간을 나눠가면서

실행됨도 확인할수있다.


이제 우선순위를 다르게해서 쓰레드를 생성해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.jsp.ex;
 
class MessageSendingThread extends Thread{
    String message;
    public MessageSendingThread(String str, int prio){
        message=str;
        setPriority(prio);
    }
    public void run(){
        for(int i=0; i<1000000; i++)
            System.out.println(message+"("+getPriority()+")");
    }
}
 
class test2{
    public static void main(String[] args){
        MessageSendingThread tr1 = new MessageSendingThread("First", Thread.MAX_PRIORITY);
        MessageSendingThread tr2 = new MessageSendingThread("Second", Thread.NORM_PRIORITY);
        MessageSendingThread tr3 = new MessageSendingThread("Third", Thread.MIN_PRIORITY);
        
        tr1.start();
        tr2.start();
        tr3.start();
    }
}
 
cs


7line에서 setPriority메소드는 Thread클래스의 인스턴스 메소드로

쓰레드의 우선순위를 변경한다.

17~19line의 MAX_PRIORITY는 쓰레드의 최고 우선순위,

MIN_PRIORITY는 최저 우선순위를 의미하는 static상수로

그값은 10과 1이다. 그리고 NORM_PRIORITY는 중간 우선순위이며

상수로는 5를 가진다. 이렇듯 static 상수를 이용해서

우선순위를 명시해도 되지만 그냥 정수를 사용해서 명시해도 된다.

결과값으로는


First(10)

First(10)

...............

Second(5)

Second(5)

..........

Thrid(1)


위와같이 출력될것이다.


실행결과를 통해서 우선순위가 가장 높은 쓰레드가 종료되어야

그 다음 우선순위의 쓰레드가 실행됨을 확인할 수 있다.

보통 우선순위가 8인 쓰레드와 2인쓰레드가 대략 8대2의 비율로

CPU를 할당 받아서 실행된다고 생각하는 경우가 있는데 대부분의

시스템에서는 우선순위가 높은 쓰레드에게만 실행의 기회를 부여한다.




댓글

Designed by JB FACTORY