JAVA - 쓰레드의 라이프 싸이클(Life Cycle)

이전 포스팅까지 쓰레드의 생성방법과

우선순위 컨트롤에 대해 알아보았다.

이번엔 쓰레드의 라이프 싸이클이다.

먼저 쓰레드가 처리되는 방식을 전체적으로 정리해보자.



쓰레드가 생성되면 위 그림이 처럼 네 가지 상태 중

한 가지 상태에 있게된다. 각각의 상태에 놓이는 시점과

상태가 변경되는 시점을 정리하면 아래와 같다.


New상태

쓰레드 클래스가 키워드 new를 통해서

인스턴스화 된 상태를 가리켜 New상태 라한다.

이상태에서는 자바 가상머신에 의해 관리가 되는

쓰레드의 상태는 아니다. 운영체제에 입장에서는

쓰레드라 부르기에는 이른감이 있다. 그러나 자바에서는

이 상태에서부터 쓰레드라 표현한다.


Runnable상태

쓰레드 인스턴스를 대상으로 start 메소드가 호출되면

해당 쓰레드는 그때부터 Runnable상태가 된다.

이는 모든 실행의 준비를 마치고 스케줄러에 의해서

선택되어 실행될 수 있기만을 기다리는 상태다.

그래서 우리는 start메소드가 호출된다고 해서

바로 run메소드가 호출되는것이 아님을 알 수 있다. Runnable상태에

있다가 스케줄러에 의해서 실행의 대상으로 선택이 되어야 run메소드가

처음 호출이 된다.


Blocked상태

실행중인 쓰레드가 sleep 또는 join메소드를 호출하거나

CPU의 할당이 필요치 않는 입출력 연산을 하게되면 CPU를

다른 쓰레드에게 양보하고 본인은 Blocked상태가 된다.

Blocked상태에서는 스케줄러의 선택을 받을수 없다.

다시 스케줄러의 선택을 받아서 실행이 되려면, Blocked상태에

놓이게 된 원인이 제거되어서 Runnable상태로 돌아와야한다.

입출력 작업으로 인해서 Blocked상태가 되었다면 입출력 작업이 완료되어서

Runnable상태가 된다. 그리고 sleep메소드의 호출로 인해서 Blocked상태가 되었다면

sleep메소드가 반환이 되면서 다시 Runnable상태가 된다.


Dead상태

run 메소드의 실행이 완료되어서 run메소드를 빠져 나오게 되면,

해당 쓰레드는 Dead상태가 된다. 그리고 이 상태는 쓰레드의 실행을 위해서

할당 받았던 메모리를 비롯해서 각종 쓰레드 관련 정보가

완전히 사라지는 상태이다. 참고로 한번 Dead상태가 된 쓰레드는

다시 Runnable상태가 되지 못한다. 쓰레드의 실행을 위해

필요한 모든 것이 소멸되기 때문이다.



댓글

Designed by JB FACTORY