"안녕, 아미고!"
"이제 sleep, yield 및 join 방법에 대해 조금 말씀드리겠습니다."
"지루하군요. 방금 인터뷰 질문을 찾았습니다. ' yield (), sleep () 및 wait () 방법 의 차이점은 무엇입니까 ?'. 설명할 수 있습니까?"
"문제없어. 우선, 이것들은 완전히 다른 세 가지 방법이다."
1) sleep(timeout) – timeout 매개변수에 의해 표시된 밀리초 동안 현재 스레드(sleep가 호출된)를 중지합니다. 그런 다음 스레드는 TIMED_WAITING 상태로 들어갑니다. isInterrupted 플래그가 설정된 경우 메소드가 더 일찍 종료될 수 있습니다.
예 | 설명 |
---|---|
|
현재 스레드는 500밀리초 또는 0.5초 동안 자체 실행을 일시 중단합니다. |
2) yield() – 현재 스레드가 '차례를 건너뜁니다'. 스레드는 실행 중 상태에서 준비 상태로 이동하고 JVM은 다음 스레드로 진행합니다. 실행 및 준비 상태는 RUNNABLE 상태의 하위 상태입니다.
예 | 설명 |
---|---|
|
현재 스레드는 "차례를 건너뛰고" Java는 즉시 다음 스레드로 전환합니다. |
3) wait(timeout) – wait () 메서드 의 한 버전 이지만 시간 초과가 있습니다. " 대기 메서드는 현재 스레드에 의해 잠긴 뮤텍스 개체의 동기화된 블록 내에서만 호출할 수 있습니다 . 그렇지 않으면 메서드에서 Illegal MonitorState 예외가 발생합니다.
"이 메서드를 호출하면 뮤텍스 개체의 잠금이 해제되어 다른 스레드가 획득할 수 있습니다. 또한 스레드는 WAITING 상태(매개 변수가 없는 wait() 메서드의 경우) 또는 TIMED_WAITING 상태(wait(timeout ) 방법)."
예 | 설명 |
---|---|
|
wait 메서드가 호출되면 현재 스레드는 모니터 개체의 잠금을 해제하고 500밀리초 동안 휴면합니다. 모니터 개체는 다른 스레드에서 획득할 수 있습니다. 500밀리초 후에 스레드가 깨어나고 모니터가 사용 중이 아니면 스레드가 이를 획득하고 작업을 계속합니다. 모니터가 다른 스레드에 의해 잠긴 경우 현재 스레드는 BLOCKED 상태로 전환됩니다. |
4) 가입(타임아웃)
"이 방법은 귀하의 질문에는 없었지만 제 수업 계획에는 있으므로 알려 드리겠습니다. join() 또는 join(timeout) 메소드를 호출하면 현재 스레드가 스레드에 '연결'됩니다. 이 메서드를 호출했습니다. 현재 스레드는 휴면 상태가 되고 조인된 스레드(즉, join() 메서드가 호출된 스레드)가 끝날 때까지 기다립니다."
"현재 스레드는 join() 메서드에 대해 WAITING 상태에 들어가고 join(timeout) 메서드에 대해 TIMED_WAITING 상태에 들어갑니다."
예 | 설명 |
---|---|
|
현재 스레드는 workerThread 스레드에 합류하고 종료될 때까지 기다립니다. 그러나 500밀리초 후에 '조인 해제'되고 계속 실행됩니다. |
"wait(timeout) 및 join(timeout) 메서드의 시간 초과는 메서드가 절전 모드로 전환되고 무언가를 기다리지만 밀리초 단위로 지정된 시간 제한보다 길지 않음을 의미합니다. 그런 다음 깨어납니다."
"이러한 방법의 유일한 공통점은 시간 초과인 것 같습니다. 완전히 다른 작업을 수행합니다."
"그래, 맞아."
GO TO FULL VERSION