본문
쓰레드의 우선순위
# 쓰레드의 우선순위
쓰레드는 우선순위(priority)라는 속성(멤버변수)을 갖고 있는데, 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다.
예를 들어, 파일전송기능이 있는 메신저의 경우, 파일다운로드를 처리하는 쓰레드보다 채팅내용을 전송하는 쓰레드의 우선순위가 더 높아야 사용자가 채팅하는데 불편함이 없을 것이다. 대신 파일다운로드 작업에 걸리는 시간은 더 길어질 것이다.
이처럼 시각적인 부분이나 사용자에게 빠르게 반응해야하는 작업을 하는 쓰레드의 우선순위는 다른 작업을 수행하는 쓰레드에 비해 높아야한다.
쓰레드가 가질 수 있는 우선순위의 범위는 1~10이며 숫자가 높을수록 우선순위가 높다. 그러나 우선순위의 높고 낮음은 절대적인 것이 아니라 상대적인 것임에 주의하자. 예를 들어 같은 프로세스의 두 쓰레드의 우선순위를 각각 1과 2로 설정하는 것과 9와 10으로 설정하는 것은 같은 결과를 얻는다. 프로세스에게 주어진 실행시간을 두 쓰레드에게 어떠한 비율로 나누어 할당할 것인지는 쓰레드간의 우선순위 차이에 의해서 설정된다.
한 가지 더 알아두어야 할 것은 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받는다는 것이다.
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 |
thread01과 thread02 모두 main메서드에서 생성하였기 때문에 main메서드를 실행하는 쓰레드의 경우 우선순위인 5를 상속받았다.
그 다음에 thread02.setPriority(7)로 thread02의 우선순위를 7로 변경한 다음에 start()를 호출해서 쓰레드를 실행시켰다.
이처럼 쓰레드를 실행하기 전에만 우선순위를 변경할 수 있다는 것을 기억하자.
- 출처 및 참고자료 : JAVA의정석(남궁성 저)
댓글