VisualVM-스레드 상태


85

누군가가 나에게 사이의 차이를 설명시겠습니까 Sleeping, Wait, Park, 및 MonitorVisualVM과 스레드 상태.

여기에 이미지 설명 입력

이것이 내가 찾은 것입니다.

Running: 스레드가 아직 실행 중입니다.
Sleeping: 스레드가 잠자기 상태입니다 (스레드 객체에서 yield () 메소드가 호출 됨)
Wait: 스레드가 뮤텍스 또는 장벽에 의해 차단되었으며 다른 스레드가 잠금을 해제하기를 기다리고 있습니다
Park. 파킹 된 스레드는 허용을받을 때까지 일시 중단됩니다. 스레드 해제는 일반적으로 스레드 객체에서 unpark () 메서드를 호출하여 수행됩니다
Monitor. 스레드는 실행을 재개하기 위해 조건이 참이되기를 기다리고 있습니다.

내가 이해할 수없는 것은 주립 공원인데, 실제로 스레드를 중단하는 것은 무엇입니까? 스레드가 실행을 중단하게 만든 코드를 코드에서 어떻게 감지합니까?

누군가이 점에서 나를 안내해 주시겠습니까?

감사.

답변:


53

나는 당신이 필요로하는 / 알고 싶은 모든 것을 거의 설명하는 아주 멋진 다이어그램을 발견했습니다.

여기에 이미지 설명 입력

  1. 새로운

Thread 클래스의 인스턴스를 만들지 만 start () 메서드를 호출하기 전에 스레드는 새 상태입니다.

  1. 실행 가능

스레드가 start () 메서드를 호출 한 후 실행 가능한 상태에 있지만 스레드 스케줄러가 실행중인 스레드로 선택하지 않았습니다.

  1. 달리는

스레드 스케줄러가 선택한 경우 스레드는 실행 상태입니다.

  1. 시간 대기

시간 대기는 지정된 대기 시간으로 대기중인 스레드에 대한 스레드 상태입니다. 지정된 양의 대기 시간으로 다음 메서드 중 하나를 호출하여 스레드가 시간 제한 대기 상태에 있습니다.

  • Thread.sleep (sleeptime)
  • Object.wait (시간 초과)
  • Thread.join (시간 초과)
  • LockSupport.parkNanos (시간 초과)
  • LockSupport.parkUntil (시간 초과)
  1. 실행할 수 없음 (차단됨)

스레드가 아직 살아 있지만 현재 실행할 수없는 상태입니다.

  1. 종료 됨

스레드는 run () 메소드가 종료 될 때 종료되거나 데드 상태입니다.

바라건대 이것은 귀하의 질문에 대한 답변입니다 :).

주차:

허용을 사용할 수없는 경우 스레드 스케줄링 목적으로 현재 스레드를 비활성화합니다.

스레드가 실행 권한이 없기 때문에 이런 식으로 호출하려는 경우 스레드가 보류되거나 일시 중단됩니다. 권한이 부여되면 스레드가 파킹 해제되고 실행됩니다.

LockSupport의 허가는 쓰레드와 연관되어 있고 (즉, 특정 쓰레드에 허가가 주어짐) 누적되지 않습니다 (즉 쓰레드 당 허가가 하나만있을 수 있으며 쓰레드가 허가를 소비하면 사라집니다).


응답 해 주셔서 감사합니다. 나는 또한 이것을 겪었지만 어떻게 든 내 질문에 여전히 대답이 없었습니다. 제 질문을 다시 한번 확인해 주시겠습니까? 나는 그것을 업데이트했습니다. 특별히 공원 주에 대한 답변을 찾고 있습니다.
Ali Shah Ahmed

업데이트에 다시 한번 감사드립니다. 그래서 공원 상태에서 스레드가 일정이 잡히기를 기다리고 있습니까? 아니면 어떤 조건에서 기다리고 있습니까?
Ali Shah Ahmed

@AliShahAhmed 스레드가 권한 (조건)이 실행되기를 기다리고 있습니다-특정 기간 동안이 조건이 충족되지 않고 스레드가 종료 된 경우-PS. 죄송 지연 하하 응답
마치에이 시강

39

VisualVM은 Java 스레드 상태 (@Maciej의 답변에 설명 된대로)를 다음과 같이 UI에 표시된 상태에 매핑합니다.

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

SleepingPark(시간 초과) 대기의 특별한 경우는 다음과 같습니다

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).

(매핑은에서 수행됩니다 ThreadMXBeanDataManager.java.)

Java 스레드 상태에 대한 간략한 (그리고 신뢰할 수없는) 토론은 여기 에서 찾을 수 있습니다 .

추가하기 위해 편집 :

네이티브 메서드에 대한 호출에서 차단되는 스레드가 JVM RUNNABLE에로 나타나 므로 VisualVM에서 Running(그리고 100 % CPU를 소비하는 것으로)보고 된다는 점도 주목할 가치가 있습니다.


2
정답이되어야합니다. 질문은 JVM 스레드 상태가 아닌 JVisualVM 스레드 상태에 관한 것입니다.
digital_infinity
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.