2010-07-08 7 views
3

wait()와 wait (timeout)의 차이점은 무엇입니까? wait()는 알림 호출을 기다려야하지만 왜 대기 (타임 아웃)해야합니까?wait()/wait (timeout)/sleep (timeout)?

그럼 수면 (시간 초과)과 대기 (시간 초과)의 차이점은 무엇입니까?

답변

10

타임 아웃이 경과 한 후에 스레드가 계속 대기 중이면 wait (timeout)가 반환됩니다. 중단 알림 (저전력 폴링) 등입니다. 절전 (시간 초과) 은 시간 초과가 될 때까지 깨우기를하지 않습니다. wait (timeout)는 notify() 호출 또는 시간 초과 중 빠른 날짜입니다.

이 방법은 현재 스레드 (호출 T)은 임의 포기 후이 객체 에서 대기 세트 자체를 배치되게하고,이 오브젝트에 대한 모든 동기 항 : JavaDoc을 인용

. 스레드 T는 thread의 스케줄링에 관해서 무효가되어 네 가지 중 하나가 일어날 때까지 대기있다 :

  • 다른 thread가이 객체에 대한 방법을 통보하고 스레드가 될로서 T가 임의로 선택 될 일이 스레드 호출 깨웠다.
  • 다른 스레드는이 객체에 대해 notifyAll 메소드를 호출합니다.
  • 일부 다른 스레드 인터럽트 스레드 T.
  • 지정된 양의 실시간이 경과했습니다. 그러나 시간 초과가 0이면 실시간은 고려 사항에 반영되지 않으며 스레드는 알림을받을 때까지 기다립니다.
+3

그냥 말해서 ... 스레드가 중단되면 잠자기 (시간 초과)가 깨어납니다. 하지만 다른 사람들도 그렇게해야합니다. – cHao

+1

sleep (timeout)에는 동기화가 필요하지 않으며 wait (timeout)에는 동기화가 필요하지 않습니다. –

+0

그럼 내 알림을 기다리지 않고 인터럽트로 잠을 멈출 수 있다면 정확히 무슨 차이가 있습니까? * x * 초를 기다리고 싶습니다. 어떤 것을 선택해야합니까? – Pacerier

2

wait()wait(timeout) 사이의 유일한 차이는있는 notify()없이 wait() 것이다 결코 일어나 그. wait(timeout)의 시간 초과> 0을 사용하면 notify()에 대한 호출이 발생하지 않으면 응용 프로그램을 "영구적으로"잠글 수 없습니다.

+1

그래서 잠 (시간 초과)과 대기 (시간 초과)가 동일합니다 !!! ??? – JavaUser

+1

두 가지 방법의 가장 큰 차이점은 대기 모드는 수면 모드에서는 개체 모니터의 소유권을 해제한다는 것입니다. 예를 들어 객체에 두 개의 동기화 된 메서드 A()와 B()가 있다고 가정 해 봅시다. A()에서 wait (timeout)을 호출하면 다른 스레드가 대기하는 동안 다른 스레드가 B()를 호출 할 수 있습니다. 그러나 A()에서 sleep (timeout)을 호출하면 다른 스레드는 sleep이 끝나고 A()가 끝날 때까지 B()를 호출 할 수 없습니다 (잠자기 중에 객체 모니터의 잠금이 해제되지 않기 때문에). – MKA

+0

아니요 차이점을 설명하는 내 대답 또는 xagyg를 읽으십시오. – Borealid

5

wait (시간 초과) : 시간 초과가 만료되면 스레드가 깨어나서 동기화 잠금을 다시 획득하려고 시도합니다 (즉, 다른 스레드가 시간 초과 기간 내에 알림을 보내지 않은 경우).

sleep (시간 초과) : sleep은 sycnhronization 코드없이 사용할 수 있습니다. 단지 지정된 시간 동안 스레드를 절전 모드로 전환합니다. wait는 동기화 된 코드 내에서 사용해야합니다.

따라서 스레드가 다른 스레드에 의해 알림을받을 것으로 기대할 때 대기가 사용됩니다 (하지만 제한 시간이 아닐 수도 있습니다). 그리고 wait는 동기화 된 코드 내에서 호출되어야합니다.

+0

wait v. sleep의 사용 사례 의미를 설명하기 위해 +1 –

+0

"다른 스레드가 스레드에 통지한다는 것을 기대한다"isn '인터럽트'의 목적도 아닌가? 차이점은 무엇입니까? – Pacerier

0

차이점은 이러한 방법은 다른 목적으로 설계된다는 것입니다. 대기 스레드 간의 동기화에 사용되는 동안 수면, 스레드 실행에 무조건 지연을 도입 사용 예 :

  1. 당신이 카운트 다운, 지연, 당신이 수면 (t)를 사용한다 타이머를 구현하려면 .당신이 1이 2가 1 하나가 제공하는 무엇을 소비하는 소비자는 동안, 무작위로 데이터를 생성합니다 프로듀서 2 (또는 그 이상) 스레드가있는 경우, 당신은 대기() /() 통지 패턴

  2. 가야한다 플랫폼에있는 경우이 스레드 동기화에 대해 현대적인보다 편리한 래퍼를 고려하십시오.

  3. 당신은 사건이있다, 그러나 당신이 특정 시간 대신 대기 영원히 매달려(), 당신은 대기 (t) 대신 의 대기() 갈 후에 발사 시간 제한을 추가합니다. 당신이 (t)를 통지하지 기다리지 않을 경우 사실

는 (t) 잠을 유사하게 작동합니다 - 당신이 경우 1을 사용할 수 있도록이 타임 아웃 후 거 복귀, 그러나 그것은 훨씬 더 투박하고 추한.