2011년 5월 21일 토요일

스레드의 우선순위(Priority)

오늘은 저번 시간에 약간 건드렸지만 쓰레드에 우선순위를 두고 원하는 특정 쓰레드를 빨리 처리하는 법(?)을 배워보도록 하자. 여러개의 쓰레드를 돌려서 동시작업을 진행하더라도 어떤 쓰레드는 가장 빨리 작동하기를 원하는게 있을수 있다. 그럴때는 쓰레드별로 우선순위를 정해서 세팅을 해놓고 프로그램을 돌리면 된다. 저번 시간에 보았던 예제를 오늘 수업에 맞게 일부분 수정하였으니 뭐가 바뀌었는지 어떻게 우선순위를 세팅하는지 저번 시간에 졸지 않았다면 예제를 그냥 보기만 하면 이해하는데 큰 무리가 없을 것이다.


저번 시간에 본 예제와 상당히 흡사하다. 다른점은 sleep( ) 메소드 쓸려고 메인메소드에서 예외처리를 해줬고 중간에 우선순위를 정하기 위해서 setPriority( ) 메소드를 이용하였다. 해당 메소드의 괄호안을 보면 아래와 같은 문구가 있는 것을 볼수 있다.

java.lang.Thread
public static final int MAX_PRIORITY    //기본값은 10 으로 세팅되어 있다
public static final int MIN_PRIORITY     //기본값은 1 로 세팅되어 있다
public static final int NORM_PRIORITY //기본값은 5 로 세팅되어 있다

주석에 달아놓았듯이 괄호안에 1부터 10까지 원하는 우선순위값을 setPriority( ) 메소드에 넘겨주면 값이 높은 쓰레드부터 더 큰 비중을 두고 먼저 처리한다. 정수값 대신에 위에 있는 변수명을 적어주면 기본값으로 정해져있는 해당값을 자동으로 넘겨준다. 우리가 저번시간에 우선순위값을 주지도 않고 값을 출력하라고 요청했을때 5라는 숫자가 나온 것은 쓰레드의 기본우선순위값이 NORM_PRIORITY로 위처럼 5라고 자동세팅되어 있기 때문이다.

혹시나 저번 시간에 왜 5가 찍힐까하는 의문을 가졌던 이들은 그 궁금증이 해소되었길 바란다. 본 예제를 여러번 실행해보면 쓰레드의 우선순위값이 높은 곳에 더 비중을 두고 해당명령이 처리되는 것을 확인할수 있다. 중간에 우선순위가 낮은 쓰레드를 돌리는 중이라도 우선순위가 높은 쓰레드를 발견시 해당 쓰레드를 우선적으로 먼저 처리할려고 동작하는 모습을 볼수 있을 것이다. 여러분의 작업환경에 따라 결과값이 달라질수 있으므로 직접 실행해보면서 공부하기 바란다.

이렇게 다중쓰레드도 개별로 가중치를 다르게 하여 우리가 어느 정도 제어를 할수 있도록 만들어주는게 오늘 배운 강좌의 중심내용이라고 할수 있을 것이다. 별 어려운건 없었을 것이나 눈으로만 보지말고 직접 프로그램을 짜보고 응용도 해보면서 공부하기 바란다. 자신이 직접 해보면 새롭게 깨우치는 부분이 꼭 생기기 마련이다. 그것은 본인을 제외한 어느누구도 채워주고 싶어도 채워줄수가 없다. 이런 것이 진정한 프로그래밍의 묘미인데 강이의 자바강좌를 듣는 모든 이들은 이런 범주에 속하길 기원한다.^^

댓글 4개:

  1. 직접 해보면서 새롭게 깨우치라는데 댓글이 하나도 없... +ㅆ+;;;
    눈팅 만 해서 죄송합니다 =ㅅ= !

    답글삭제
  2. 미쳤음 진짜 강의 대박 너무좋아요 이해가 이러케 잘되는 블로그강의 처음봐여

    답글삭제
  3. 글쓴이가댓글 단거같은데.. 진정한 강의라면 run의 for문은 무슨 용도이며 result값도 게시해놓아야하는데

    답글삭제
  4. ㅋㅋㅋㅋㅋ쓰레드 시작도 전에 슬립을 뭐 저리 많이 한담

    답글삭제