"안녕, 아미고!"

"이제 sleep, yield 및 join 방법에 대해 조금 말씀드리겠습니다."

"지루하군요. 방금 인터뷰 질문을 찾았습니다. ' yield (), sleep () 및 wait () 방법 의 차이점은 무엇입니까 ?'. 설명할 수 있습니까?"

"문제없어. 우선, 이것들은 완전히 다른 세 가지 방법이다."

1) sleep(timeout)  – timeout 매개변수에 의해 표시된 밀리초 동안 현재 스레드(sleep가 호출된)를 중지합니다. 그런 다음 스레드는 TIMED_WAITING 상태로 들어갑니다. isInterrupted 플래그가 설정된 경우 메소드가 더 일찍 종료될 수 있습니다.

설명
Thread.sleep(500);
현재 스레드는 500밀리초 또는 0.5초 동안 자체 실행을 일시 중단합니다.

2) yield()  – 현재 스레드가 '차례를 건너뜁니다'. 스레드는 실행 중 상태에서 준비 상태로 이동하고 JVM은 다음 스레드로 진행합니다. 실행 및 준비 상태는 RUNNABLE 상태의 하위 상태입니다.

설명
Thread.yield();
현재 스레드는 "차례를 건너뛰고" Java는 즉시 다음 스레드로 전환합니다.

3) wait(timeout) – wait () 메서드  의 한 버전 이지만 시간 초과가 있습니다. " 대기 메서드는 현재 스레드에 의해 잠긴 뮤텍스 개체의 동기화된 블록 내에서만 호출할 수 있습니다 . 그렇지 않으면 메서드에서 Illegal MonitorState 예외가 발생합니다.

"이 메서드를 호출하면 뮤텍스 개체의 잠금이 해제되어 다른 스레드가 획득할 수 있습니다. 또한 스레드는 WAITING 상태(매개 변수가 없는 wait() 메서드의 경우) 또는 TIMED_WAITING 상태(wait(timeout ) 방법)."

설명
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
wait 메서드가 호출되면 현재 스레드는 모니터 개체의 잠금을 해제하고 500밀리초 동안 휴면합니다. 모니터 개체는 다른 스레드에서 획득할 수 있습니다.
500밀리초 후에 스레드가 깨어나고 모니터가 사용 중이 아니면 스레드가 이를 획득하고 작업을 계속합니다.
모니터가 다른 스레드에 의해 잠긴 경우 현재 스레드는 BLOCKED 상태로 전환됩니다.

4) 가입(타임아웃)

"이 방법은 귀하의 질문에는 없었지만 제 수업 계획에는 있으므로 알려 드리겠습니다. join() 또는 join(timeout) 메소드를 호출하면 현재 스레드가 스레드에 '연결'됩니다. 이 메서드를 호출했습니다. 현재 스레드는 휴면 상태가 되고 조인된 스레드(즉, join() 메서드가 호출된 스레드)가 끝날 때까지 기다립니다."

"현재 스레드는 join() 메서드에 대해 WAITING 상태에 들어가고 join(timeout) 메서드에 대해 TIMED_WAITING 상태에 들어갑니다."

설명
Thread thread = getWorkThread();
thread.join(500);
현재 스레드는 workerThread 스레드에 합류하고 종료될 때까지 기다립니다.
그러나 500밀리초 후에 '조인 해제'되고 계속 실행됩니다.

"wait(timeout) 및 join(timeout) 메서드의 시간 초과는 메서드가 절전 모드로 전환되고 무언가를 기다리지만 밀리초 단위로 지정된 시간 제한보다 길지 않음을 의미합니다. 그런 다음 깨어납니다."

"이러한 방법의 유일한 공통점은 시간 초과인 것 같습니다. 완전히 다른 작업을 수행합니다."

"그래, 맞아."