자바에서 스레드의 생명주기는 여러 상태(state)로 나누어지며, 각 상태는 스레드가 실행되고 종료되기까지의 과정을 나타낸다.
New (새로운 상태)
- 스레드가 생성되고 아직 시작되지 않은 상태
- Thread 객체는 생성되었지만, start() 메서드가 호출되지 않은 상태
Runnable (실행 가능 상태)
- 스레드가 실행될 준비가 완료된 상태 → CPU에 올릴 수 있다
- start() 메서드가 호출되면 이 상태로 진입
- 스레드가 실행될 준비가 되어있고, 실제로 CPU에서 작업할 수 있는 상태
- 하지만 모든 Runnable 스레드가 동시에 실행되진 않고, 운영체제의 스케줄링 방식에 따라 차례대로 실행된다
- 스케줄링 실행 대기열에 있거나, 현재 CPU에서 돌아가고 있는 스레드 구분 불가
- 보통 실행 상태라고 칭한다
Blocked (차단 상태)
- 스레드가 다른 스레드에 의해 동기화 락을 얻기 위해 기다리는 상태
- 즉, synchronized 블럭에 진입하기 위해 락을 얻어야하는 경우에 이 상태에 진입
- 다른 스레드가 lock을 점유한 경우
Waiting (대기 상태)
- 스레드가 다른 스레드의 특정 작업이 완료 되기를 무기한 기다리는 상태
- wait(), join() 메서드가 호출될 때 이 상태에 진입
- 다른 스레드가 notify() 나 notifyAll() 을 호출하거나, join() 이 완료될 때 까지 대기
Timed Waiting (시간 제한 대기 상태)
- 스레드가 특정 시간동안 다른 스레드의 작업이 완료되기를 기다리는 상태
- 대표적으로 sleep(시간), wait(시간), join(시간) 메서드가 호출 될 때 이 상태로 진입
- 주어진 시간이 끝나거나 다른 스레드가 해당 스레드를 깨우면 상태에서 벗어난다
Terminated (종료 상태)
- 스레드 실행이 완료된 상태
- 정상적으로 종료하거나, 예외가 터져 종료 되었을 때 이 상태로 진입
- 스레드는 한번 종료되면 살릴 수 없음
Thread의 상태 전이 정리
- New → Runnable : start() 메서드를 통해 실행
- Runnable → Blocked / Waiting / Timed Waiting : 스레드가 락을 획득하지 못하거나, 시간 관련 메서드(sleep, wait)가 호출되면 이 상태로 진입
- Blocked / Waiting / Timed Waiting → Runnable : 스레드가 락을 얻거나, 기다림이 완료되면 다시 Runnable 상태로 진입
- Runnable → Terminated : run() 메서드가 종료되면 상태 전
'Java > Java' 카테고리의 다른 글
[Java] 까먹지 말아야 할 Java 메모리 구조 (1) | 2025.03.04 |
---|---|
[Java] 채팅 프로그램 소켓 연결 구현 1 - 1 대 1 통신을 해보자 (0) | 2025.02.09 |
[Java] 두줄로 이해하는 객체 직렬화, 역직렬화 (1) | 2025.01.28 |
[Java] 예외처리 - 부모 자식 관계 (1) | 2025.01.02 |
[Java] 제네릭 (Generic) (2) (1) | 2024.10.10 |