스레드 생명 주기

OS에서도 많이 본 그림인데 하나씩 살펴보면
- New
스레드가 생성되었지만 시작되지 않은 상태
start 메서드를 호출하지 않은 상태이다.
- Runnable
스레드가 실행중이거나 실행될 준비가 된 상태
start 메서드를 호출하면 해당 상태로 들어간다
OS 스케줄러가 각 스레드에 CPU 시간을 할당해 실행하기 때문에 (time waiting)
Runnable 상태 스레드는 실행 대기열에 포함되었다가 차례로 CPU에서 실행된다. - 자바에서는 이를 구분할 수 없다
- 일시 중지 상태들
- Blocked : 스레드가 락을 기다리는 상태 (뒤에서 synchronized와 모니터 락을 배운다)
- Waiting : 스레드가 무기한으로 다른 스레드의 작업을 기다리는 상태 (wait, join, notify, notifyAll)
- Timed Waiting : 스레드가 일정 기간동안 다른 스레드의 작업을 기다리는 상태 (sleep(ms), wait(ms), join(ms))
- Terminated
스레드의 실행이 완료된 상태
join 시작

main 스레드는
thread1, thread2에게 Job을 시키고 자신의 코드를 실행한다.
하지만
thread1, thread2가 종료되고 main 스레드를 종료하려면 어떻게 해야할까? -> 이때 join이 필요하다.
이런 상황은 예를 들어
thread1, thread2에 어떤 작업을 지시하고 이 결과값을 main 스레드에서 받아 사용할때 필요하다
join이 필요한 상황 예제
예를 들어
1~100까지 숫자를 더하는 작업을 수행하는데 이걸 병렬로 돌리기 위해
1~50을 더하는 작업을 thread-1에게 시키고
51~100까지 더하는 작업을 thread-2에게 시킨다고 하자
그리고 확실히 결과를 보기 위해 thread-1, thread-2에서 수행하는 작업이 2초 걸린다고 가정하자


이때 결과는 어떻게 나올까?

main 스레드가 thread-1, thread-2의 작업을 기다리지 않기 때문에
결과값이어야 하는 5050이 나오지 않고 0이라는 결과가 나온다.
'SUMMARY > JAVA' 카테고리의 다른 글
| [JAVA 고급1] 2. 스레드의 생성과 실행 (3) | 2025.08.11 |
|---|---|
| [JAVA 고급1] 1. 프로세스와 스레드 (3) | 2025.08.11 |