SUMMARY/JAVA

[JAVA 고급1] 3. 스레드 제어와 생명주기 1

grammiboii 2025. 8. 13. 01:07

 

스레드 생명 주기

 

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