본문

쓰레드의 우선순위

반응형

쓰레드의 우선순위


쓰레드는 우선순위(priority)라는 속성(멤버변수)을 갖고 있는데, 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다

쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다.

 

예를 들어파일전송기능이 있는 메신저의 경우, 파일다운로드를 처리하는 쓰레드보다 채팅내용을 전송하는 쓰레드의 우선순위가 더 높아야 사용자가 채팅하는데 불편함이 없을 것이다. 대신 파일다운로드 작업에 걸리는 시간은 더 길어질 것이다.

이처럼 시각적인 부분이나 사용자에게 빠르게 반응해야하는 작업을 하는 쓰레드의 우선순위는 다른 작업을 수행하는 쓰레드에 비해 높아야한다.

 

쓰레드가 가질 수 있는 우선순위의 범위는 1~10이며 숫자가 높을수록 우선순위가 높다. 그러나 우선순위의 높고 낮음은 절대적인 것이 아니라 상대적인 것임에 주의하자. 예를 들어 같은 프로세스의 두 쓰레드의 우선순위를 각각 12로 설정하는 것과 910으로 설정하는 것은 같은 결과를 얻는다. 프로세스에게 주어진 실행시간을 두 쓰레드에게 어떠한 비율로 나누어 할당할 것인지는 쓰레드간의 우선순위 차이에 의해서 설정된다.

 

한 가지 더 알아두어야 할 것은 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받는다는 것이다

main메서드를 수행하는 쓰레드는 우선순위가 5이므로 main메서드 내에서 생성하는 쓰레드의 우선순위는 자동적으로 5가 된다.


Source01) ThreadEx06.java

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package threadEx;
 
public class ThreadEx06 {
 
    public static void main(String[] args) {
        ThreadTest01 thread01 = new ThreadTest01();
        ThreadTest02 thread02 = new ThreadTest02();
 
        thread02.setPriority(7);
        System.out.println("Priority of thread01(-) : " + thread01.getPriority());
 
        System.out.println("Priority of thread02(|) : " + thread02.getPriority());
 
        thread01.start();
        thread02.start();
    }
}
 
// 우선순위 : 5
class ThreadTest01 extends Thread {
    final static int LOOP = 300;
    final static int DELAY = 1000000;
 
    public void run() {
        for (int i = 0; i < LOOP; i++) {
            System.out.print("-");
            // 작업이 한 번에 끝나버릴 수 있기 때문에
            // 아무 일도 하지 않는 반복문을 추가하여 작업을 지연시켰다.
            for (int x = 0; x < DELAY; x++)
                ;
        }
    }
}
 
// 우선순위 : 7
class ThreadTest02 extends Thread {
    final static int LOOP = 300;
    final static int DELAY = 1000000;
 
    public void run() {
        for (int i = 0; i < LOOP; i++) {
            System.out.print("|");
            for (int x = 0; x < DELAY; x++)
                ;
        }
    }
}
cs

 


Result)

1
2
3
Priority of thread01(-) : 5
Priority of thread02(|) : 7
-||-|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||-------------|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cs

 

thread01thread02 모두 main메서드에서 생성하였기 때문에 main메서드를 실행하는 쓰레드의 경우 우선순위인 5를 상속받았다

그 다음에 thread02.setPriority(7) thread02의 우선순위를 7로 변경한 다음에 start()를 호출해서 쓰레드를 실행시켰다

이처럼 쓰레드를 실행하기 전에만 우선순위를 변경할 수 있다는 것을 기억하자.


- 출처 및 참고자료 : JAVA의정석(남궁성 저)

반응형

공유

댓글