"안녕, 아미고!"
"우리는 새로운 주제인 스레드를 시작할 것입니다."
"시작하겠습니다. 오늘은 스레드가 실행 중일 때 스레드 개체가 통과하는(또는 통과할 수 있는) 상태를 살펴보겠습니다."
"지금 몇 개의 주 이름을 지을 수 있습니까, Amigo?"
"둘. 첫 번째는 start() 메서드가 호출되기 전의 스레드입니다. 개체는 존재하지만 스레드는 아직 활성화되지 않았습니다. 두 번째는 start() 메서드가 호출된 후입니다. 스레드가 무언가를 수행할 때입니다. 중요한."
"당신 말이 맞아요. 그런 구별이 있습니다. 이러한 상태를 new 와 running 이라고 부르지 만 그것은 시작에 불과합니다."
"첫째, 어느 시점에서 스레드가 실행을 종료합니다. 즉, 스레드 개체가 존재하지만 스레드가 새 상태 또는 실행 중 상태가 아닌 상황이 발생할 수 있습니다. "이 스레드가 실행을 완료한 상태를 호출합니다. 종료되었습니다 ."
"그러나 더 많은 것이 있습니다. 주어진 시간에 오직 하나의 스레드만 실제로 실행되고 있다는 것을 잊지 마십시오. 동시 작업으로 보이는 것은 실제로 프로세서가 스레드에서 스레드로 끊임없이 점프하는 것입니다. 스레드가 실행 중인 것처럼 보이는 별도의 상태가 있습니다. 실행 중이지만 실제로는 자신의 차례를 기다리고 있습니다. 실행 준비 상태 라고 합니다 . 스레드가 작동함에 따라 실행 상태 에서 준비 상태로 계속 전환되고 다시 활성화되면 다시 실행 상태로 전환됩니다 ."
" start () 메서드가 호출된 직후 스레드는 실행 준비 상태로 지정되고 JVM이 전환하는 공유 스레드 목록에 배치됩니다."
"그리 어렵지 않습니다. 실행을 시작하기 전에는 새로운 상태 를 갖습니다 . 완료되면 종료 됩니다 . 실행 중일 때는 스레드가 실행 중 상태이고 대기 중일 때는 준비 상태 입니다. ."
"당신의 간결함은 놀랍지만 당신 말이 맞습니다."
"하지만 더 있습니다. 스레드가 차단될 수 있습니다. 예를 들어 동기화된 블록에 들어갈 때입니다. 스레드가 동기화된 것으로 표시된 코드 블록에 도달 하고 다른 스레드가 이를 사용 중인 경우 우리 스레드는 차단된 상태로 들어가고 대기합니다. 개체의 뮤텍스(잠금)가 해제되도록 합니다."
"상태가 있는 상황은 다음과 같습니다."
"하지만 더 있습니다. 대기 라는 별도의 상태도 있습니다 . 이것은 스레드가 차단되지 않은 상태일 뿐만 아니라 준비 상태 도 아닙니다. 예를 들어 다른 스레드에서 join () 메서드를 호출할 때입니다 ."
다른 Thread 개체에서 join()을 호출하면 스레드가 "조인"하는 것처럼 보이지만 실제로는 다른 스레드가 완료될 때까지 기다립니다.
"또한 wait () 메서드(wait/notify/notifyAll 트리오 메서드에서)가 호출될 때 스레드를 대기 상태 로 전환합니다."
"워."
"잠깐만요! 아직 더 있습니다. 예를 들어 스레드는 sleep 메서드를 호출하여 휴면할 수 있습니다. 이에 대한 별도의 상태도 있습니다. « 시간 대기 »라고 합니다. « 시간 대기 »는 스레드가 다음 시간 동안 무언가를 기다리고 있음 을 의미 합니다 . 제한된 시간. wait(timeout) 또는 join(timeout)과 같은 매개 변수를 사용하여 wait 메서드를 호출하면 스레드가 시간 대기 상태로 들어갑니다."
"전체 다이어그램은 다음과 같습니다."
"음. 그게 다야? 아니면 10가지 흥미로운 상태가 더 있는 거지?"
"지금은 그 정도야."
"실제로는 첫 번째 다이어그램만 기억하면 됩니다. 더 간단하지만 두 번째 다이어그램이 더 정확합니다."
"이상하게도 인터넷에는 많은 스레드 상태 다이어그램이 있으며 모두 다릅니다."
"그래서 제가 이 도표를 드린 것입니다. 가장 완벽하고 정확합니다."
"이 다이어그램에서 준비 및 실행 상태는 실행 가능이라는 단일 블록으로 결합됩니다. 이유를 아십니까?"
"아니요. 그런 건 처음 봐요."
" Thread 클래스에는 State 라는 내부 클래스 와 공용 State getState() 메서드가 있습니다."
public enum State
{
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
"항상 Thread 개체에서 getState () 메서드를 호출 하고 현재 상태를 확인할 수 있습니다. 물론 State enum 값 중 하나가 될 것입니다."
"그렇군요. 실제 상태는 JVM 내부에 있지만 State getState() 메서드를 사용하여 Java 코드를 통해 액세스할 수 있는 상태도 있습니다."
"그리고 어떤 상황에서 내가 그것을 사용합니까?"
"아마도, 절대."
"하지만 스레드 내부에서 무슨 일이 일어나고 있는지 알아야 합니다. 그렇지 않으면 많은 버그가 생기고 원인을 추측할 수조차 없게 됩니다."
"또한 고용주는 인터뷰 중에 스레드 상태에 대해 묻는 것을 좋아합니다."
GO TO FULL VERSION