스레드 State

(출처: https://www.baeldung.com/java-thread-lifecycle)
스레드의 상태는 Thread.State enum에 정의되어 있다.
- 새로운 스레드가 만들어지면
NEW상태가 된다. 아직start()메소드가 호출되지 않은 시점이다. - 스레드의
start()메소드가 호출되면RUNNABLE상태로 전이된다. 스케줄러가 선택해 주어야 실행이 될 수 있다. CPU를 점유하지 않은 상태이다. - 스레드 스케줄러가 이 스레드를 선택하면
RUNNING상태로 전이된다.run()메소드가 수행된다. CPU를 점유하는 상태이다.- 스레드의 갯수가 CPU의 갯수 보다 많은 경우, 스레드의 실행 순서를 정해야 한다.
- 스레드의 wait 동작이 호출되면(
sleep(timeout)object.wait(timeout),otherThread.join(timeout),LockSupport.park*()메소드)TIME_WAITING상태로 전이된다. - waiting time이 지나면 다시
RUNNABLE상태로 전이되고, 스레드 스케줄러가 선택할 수 있는 후보가 된다. RUNNING상태에서는object.wait(),otherThread.join(),LockSupport.park()메소드를 호출하여 monitor condition을 기다릴 수 있으며 스레드는WAITING상태로 전이된다.Object.wait()메소드를 호출한 스레드는 다른 스레드가object.notify()나object.notifyAll()메소드를 호출해야 다시RUNNABLE상태로 돌아온다.otherThread.join()메소드를 호출한 스레드는 대상 스레드가 종료되어야RUNNABLE상태로 돌아온다.- 스레드가
run메소드를 시작한 이후에, 보호받는 리소스에 접근하려고 하는데 해당 리소스에 아직 접근할 수 없다면BLOCKED상태로 전이된다. 보호받는 리소스란synchronized메소드나 monitor lock에 의해 보호받는 상태에 있는 리소스를 의미한다. - 해당 리소스가 접근 가능하게 되면 이 스레드는 보호받는 리소스에 접근할 수 있게되며
RUNNABLE상태로 전이된다. RUNNING스레드가 실행을 마치면TERMINATED상태로 전이된다.
Monitor
- 자바 객체는 하나의 monitor를 가짐
- 어떤 monitor는 하나의 스레드에만 점유될 수 있음
- 어떤 객체의 monitor가 특정 스레드에서 점유하고 있다면, 다른 스레드는 그 객체에 진입하지 못하고, monitor가 반환될 때 까지 Wait Queue에 대기해야 함
Thread Dump 얻기
jps로 JVM PID를 얻은 다음, jstack {pid}로 덤프를 출력할 수 있다.
혹은 kill -3 {pid}로 얻을 수도 있다.
Thread Dump 분석하기 (링크들)
- 기본적인 분석 방법은 Naver D2: 스레드 덤프 분석하기를 참고한다.
- 스레드 덤프 분석기(온라인): https://fastthread.io
'잡다구리' 카테고리의 다른 글
| reactor: Synchronous generate (0) | 2022.08.13 |
|---|---|
| reactor: 동기적인 블로킹 호출을 감싸기 (0) | 2022.08.13 |
| reactor: publishOn, subscribeOn() (0) | 2022.08.13 |
| docker-compose에서 다른 서비스가 healthy 상태여야 특정 서비스를 기동하여야 할 때 (0) | 2022.08.13 |
| Redis Cluster 구성 테스트 (0) | 2022.08.12 |
| redis docker (0) | 2021.08.24 |
| 날짜와 시간 (0) | 2021.07.31 |
| 스프링 배치 완벽 가이드 - 6. 잡 실행하기 (0) | 2021.05.09 |
댓글