스레드 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 |
댓글