경진의 블로그

스레드 - 스레드 우선순위 본문

개인참고자료/자바(네트워크)

스레드 - 스레드 우선순위

aith 2008. 7. 12. 02:19
스레드 우선순위

스레드 여러 개를 운영하는 애플리케이션이라면 때때로 특정 스레드가 먼저 실행되게 하고 싶은 경우도 있다.

하나의 CPU를 가진 머신의 어떤 애플리케이션에서 여러 스레드가 실행되고 있다고 가정해본다.
하이퍼스레딩이 지원되지 않는 CPU라면 멀티 CPU 머신이 아닌 이상 한 순간에 스레드 하나 밖에 실행할 수 없다. 따라서 JVM은 실행 대기중에 있는 스레드 중에서 우선순위에 따라 시분할(Time Sharing 또는 타임 슬라이싱) 방식으로 스레드에게 작업 기회를 주게 된다.

또 다른 상황은 여러 개의 스레드가 동시에 A라는 공유 인스턴스(클래스 객체)에 접근하려고 할 때다. 이때 A공유 객체는 동기화 되어 있으므로 순간적으로 오직 스레드 하나만을 선점해서 실행 할 수 있다. 그러면 스레드 하나는 A 객체의 락(lock, 동기화된 객체를 실행할 권한, 즉 제어권)을 얻어 실행하고 실행을 마친 후에 락을 놓으면 자바 런타임 시스템은 그 객체의 락(제어권)을 얻기 위해 기다리는 스레드 중에서 우선순위가 높은 스레드를 선택해서 그 스레드에게 락(제어권)을 넘겨 준다.

Thread 클래스에서 이런 상황에서 개발자가 스레드를 적절히 제어할 수 있도록 스레드의 우선순위를 설정할 수 있는 메소드를 제공한다.

※ 스레드의 우선순위로 동기화된 자원은 락(제어권)을 얻는 순서가 결정된다고 해서 스레드의 우선순위로 락(제어권)을 대체하면 안된다. 스레드의 우선순위는 단지 여러 스레드가 어떤 동기화의 우선순위를 결정하기 위한 지표로서만 유용하게 사용된다.

Thread 클래스의 세가지 순위 (스레드 우선순위는 1~10까지 사용한다)

static int MAX_PRIORITY = 10
static int MIN_PRIORITY = 1
static int NORM_PRIORITY = 5 (기본값)

첨부파일


PriorityThreadTest.java을 실행한다. setPriority() 메소드로 우선순위를 설정하고 getPriority() 메소드로 현재 설정된 우선순위를 확인한다.

애플리케이션의 작업 범주에 따른 일반적인 우선순위 설명

범위 사용
10 위기 관리
7~9 상호작용, 이벤트 처리
4~6 IO 관련작업
2~3 백그라운드 작업
1 기타 다른 작업이 없을때 실행

다른 작업이 없을때 실행
※ 스레드 우선순위도 가급적 사용하지 말 것을 권장한다. 그 이유는 시스템과 스레드 자체에 대한 높은 수준의 지식 없이 스레드를 건디리면 에상치 못한 버그가 밸생할 가능성이 높기 때문이다. 또한 굳이 스레드의 우선순위를 런타임 시점에 바꿔가며 사용할 만한 상황도 별로 없다.
0 Comments
댓글쓰기 폼