스레드 상태
- 스레드는 객체가 생성, 실행, 종료 되기까지 다양한 상태를 가진다.
- Thread.State 는 enum 타입이다.
- 내부에는 6개의 문자열 상수를 가지고 있다.
- NEW : 객체가 처음 생성되어 start()메서드가 실행되기 전 상태
- RUNNABLE : start() 메서드로 스레드가 실행된 상태
- TERMINATED : run() 메서드가 종료된 상태
- TIMED_WAITING : 정적 메서드 Thread.sleep(long millis), join(long millis)가 호출된 상태
- BLOCKED : 동기화 블록을 실행하기 위해 먼저 실행 중인 스레드의 실행완료를 기다리는 상태
- WAITING : 시간 정보가 없는 join() 또는 wait()메서드가 호출된 상태
스레드 상태 값 가져오기
- 스레드 변수명.getState(); 메서드를 이용해 호출
Thread myThread = new Thread();
Thread.State = myThread.getState();
NEW
- Thread 객체를 new 키워드를 이용해 생성한 시점으로 아직 start()메서드 호출 이전 상태, 즉 실행 이전 상태.
RUNNABLE
- start() 명령이 실행되어 run()메서드의 구문이 실행 중인 상태.
- RUNNABLE 상태에서는 스레드 간의 동시성에 따라 실행과 대기를 반복한다.
- 정적 메서드인 yield()를 호출하면 다른 스레드에게 CPU 사용을 인위적으로 양보하고, 자신은 실행 대기 상태로 전환할 수 있다.
- 다음 차례가 돌아올 때 다시 CPU를 사용할 수 있다.
TERMINATED
- run()메서드가 완전히 종료된 상태
- TERMINATED 상태가 되면 재사용이 불가능하다. 다시 실행하고 싶다면, 새로운 객체를 만들어야 한다.
TIMED_WAITING
- RUNNABLE 상태에서 일시정지 상태로 전환된 상태
- Thread.sleep(long millis) 또는 join(long millis)가 호출된 상태
- 스레드객체.join(long millis) 메서드는 특정 스레드 객체에게 일정 시간 동안 CPU를 할당하라는 의미이다.
- Thread.sleep(long millis)은 메서드를 호출한 스레드를 일시정지하라는 의미이다.
- 스레드객체.join(long millis)
BLOCKED
- BLOCKED는 동기화 메서드 또는 동기화 블록을 실행하고자 할 때 이미 다른 스레드가 해당 영역을 실행하고 있는 경우 발생한다.
- 동기화 영역이 잠겨 있을 때 이미 실행하고 있는 스레드가 실행을 완료하고, 해당 동기화 영역의 열쇠를 반납할 때 까지 기다려야 하는데 이것이 바로 BLOCKED 상태이다.
WAITING
-
시간 지정 없이 스레드객체.join()이 호출되면, 조인된 스레드의 객체의 실행이 완료될 때 까지 이를 호출한 스레드는 WAITING 상태가 된다.
-
스레드의 인스턴스 메서드인 wait()를 호출할 때도 해당 스레드는 WAITING 상태가 된다.
스레드가 wait()메서드의 호출로 WAITING 상태가 됐을 때 주의할점
- 다른 쓰레드에서 notify(), notifyAll() 메서드가 호출되면 일시정지 됐던 지점인 wait()메서드 다음줄 부터 이어 실행한다.
- wait(), notify(), notifyAll() 메서드는 반드시 동기화 블록에서만 사용할 수 있다.