하지만 좀더 정확하게 말하면 현실적으로는 꼭 그렇지는 않습니다.
즉, 만들어진 Thread가 항상 동시에 일을 하고 있는 것은 아니란 뜻입니다.
보통 컴퓨터에는 CPU가 몇 개 밖에 없는데, 몇 개 안되는 CPU를 가지고 수십 개의
Thread를 동시에 수행시킬수는 없기 때문에 Runnable Thread에게 순서를 정해서 CPU등
시스템 자원을 할당해줍니다. 이런 행동을 스케쥴링이라고 합니다.
자바 런타임 환경은 경쟁하는 Thread를 스케쥴링하는 아주 단순한 원칙이 있습니다.
모든 Runnable Thread마다 우선순위가 정해져 있는데, 이 우선순위에 따라서 스케쥴링을
합니다. 우선 순위가 높은 Thread가 있으면 CPU등 시스템 자원을 할당합니다.
자바의 Thread의 우선 순위는 Thread를 만든 Thread의 우선순위를 물려받게 됩니다.
물론 만들어진 Thread의 우선 순위를 조절할 수 있긴합니다. 만들어지는 Thread의
우선 순위를 만드는 Thread의 우선 순위보다 높게 할 수은 없겠지요.
우선순위의 값은 MIN_PRIORITY와 MAX_PRIORITY값으로 Thread 클래스에 정의되어 있는데
숫자가 높으면 우선순위가 높은겁니다. 빨리 스케쥴링된다는 뜻입니다.
어떤 순간에 경쟁하고 있는 Runnable Thread가 있다면 그중 가장 우선 순위가 높은
Thread가 선택되어 집니다. Runnable Thread들은 시스템 자원을 우선 순위 Runnable
Thread에게 항상 빼앗긴다는 것입니다.
만약 Runnable Thread가 모두 우선 순위가 같다면 일을 하고 있는 Thread의 시스템
자원을 강제로 뺏아가지는 않습니다. 즉,일을 하고 있는 Thread와 같은 우선 순위의
Thread가 많이 있다 하더라도 일을 하고 있는 Thread가 모두 일을 마친후에야 시스템
자원을 차지할 수 있는 기회가 생깁니다.
하지만 만약 시분할 방식의 스케줄링이 지원된다면 정해진 시간 분량만큼 시스템 자원을
사용한 후에는 시스템 자원을 내어 놓고 다음 순서를 기다리게 되겠지요.
하지만 모든 자바 런타임환경이 시분할 방식의 스케쥴링을 지원한다고 볼수는 없기 때문에
신분할 방식에 의존해서 프로그램을 해서는 곤란하겠습니다.
요약하면 Runnable Thread가 여러 개인 경우 우선 순위가 높은 Thread는 항상 선택되어
지고,동일한 우선순위의 Thread의 경우는 일하고 있는 Thread가 계속 권리를 가집니다.
우선 순위가 낮다면 절대로 선택되지 않습니다.
시스템 자원을 사용하는 Runnable Thread보다 좀 더 우선순위가 높은 Runnable Thread가
생기게 되면 우선 순위가 높은 Thread가 바로 선택되어집니다.
물론 우선 순위의 Runnable Thread라도 yield() 메소드를 호출하거나 run() 메소드를
모두 수행해서 일생을 마치게 되면 우선 순위가 낮은 Thread에게 기회가 옵니다.
하지만 Thread가 yield() 메소드를 호출한다고 해도 자신보다 우선 순위가 낮은 Thread
에게는 기회를 양보할 수 없습니다. 양보가 안되는 겁니다.
자바 런타임 환경이 시분할 방식의 스케쥴링을 구현한다고 하면 Thread에게 할당된 시간
분량이 지나면 Running Thread는 시스템 자원을 모두 반환하고 다음 기회를 기다리게
됩니다. 대개의 시스템이 그렇지만 우선순위가 가장 높은 Thread가 대개 시스템 자원을
확보해서 일을 하겠지만 항상 우선순위가 높은 Thread가 시스템 자원을 독점하느냐 하면
그렇지는 않습니다. 만약 모든 예외가 없이 우선 순위만으로 스케쥴링이 된다면 우선 순위
가 낮은 Thread의 경우 시스템 자원을 할당 받지 못해서 일을 해볼 기회 자체를 얻지
못할 수 있기 때문에 시스템마다 이런 상황에 대한 대비를 해놓기 때문입니다.
'자바 Threads Programming > Basic' 카테고리의 다른 글
Thread-7.경쟁하는 Thread와 공유당하는 객체 (0) | 2008.01.09 |
---|---|
Thread-5.Thread 라이프사이클(Life Cycle) (0) | 2008.01.07 |
Thread-4.간단한 Thread 검색 프로그램 (0) | 2007.12.28 |
Thread-3.Thread와 Thread의 상속 (0) | 2007.12.28 |
Thread-2.Thread의 사용방법 (0) | 2007.12.18 |