스레드 상태
스레드의 상태는 다음과 같이 총 6가지이며, JVM에 의해 관리된다.
-
NEW: 스레드가 생성되었지만 아직 실행할 준비가 되지 않은 상태이다. start() 메소드가 호출되면 RUNNABLE 상태가 된다.
-
RUNNABLE: 스레드가 현재 실행되고 있거나, 실행 준비되어 스케줄링을 기다리는 상태이다.
-
TIMED_WAITING: 스레드가 sleep(long n)을 호출하여 n 밀리초 동안 잠을 자는 상태이다.
-
BLOCK: 스레드가 입출력 작업을 실행하여 I/O 작업의 완료를 기다리면서 멈춘 상태이다. JVM이 자동으로 현재 스레드를 BLOCK 상태로 만들고 다른 스레드를 스케줄링한다.
-
WAITING: 스레드가 어떤 a 객체에 대해 a.wait() 메소드를 호출하여, 다른 스레드가 a.notify(), a.notifyAll() 메소드를 불러줄 때까지 무한정 기다리는 상태이다.
-
TERMINATED: 스레드가 종료한 상태이다. 더 이상 다른 상태로 변이할 수 없다.
스레드 우선 순위와 스케줄링
JVM은 철저히 우선 순위를 기반으로 스레드를 스케줄링한다. 가장 높은 우선 순위의 스레드를 먼저 실행시키며, 동일한 우선 순위의 경우에는 돌아가면서 실행시킨다. 자바 스레드의 우선 순위 체계는 다음과 같다.
-
최댓값(MAX_PRIORITY) = 10
-
최솟값(MIN_PRIORITY) = 1
-
보통 값(NORMAL_PRIORITY) = 5
자바 응용 프로그램이 실행될 때, 처음으로 생성되는 main 스레드는 보통 값 우선 순위로 태어난다. 자식 스레드는 생성될 때 부모 스레드의 우선 순위 값을 물려받는다.
main 스레드
JVM은 자바 응용 프로그램을 실행하기 직전에 사용자 스레드를 하나 만들고, 이 스레드로 하여금 main() 메소드를 실행하도록 한다. 이 스레드가 바로 메인 스레드이고, 실행 시작 주소는 main() 메소드의 첫 코드가 된다.
package ch13n4;
public class ThreadMainEx {
public static void main(String[] args) {
long id = Thread.currentThread().threadId(); // 스레드 ID를 반환한다.
String name = Thread.currentThread().getName(); // 스레드 이름을 반환한다.
int priority = Thread.currentThread().getPriority(); // 스레드 우선 순위 값을 반환한다.
Thread.State s = Thread.currentThread().getState(); // 스레드 상태 값을 반환한다.
System.out.println("현재 스레드 이름 = " + name);
System.out.println("현재 스레드 ID = " + id);
System.out.println("현재 스레드 우선 순위 값 = " + priority);
System.out.println("현재 스레드 상태 = " + s);
}
}