programing

wait()와 sleep()의 차이

goodsources 2022. 8. 7. 16:52
반응형

wait()와 sleep()의 차이

wait() ★★★★★★★★★★★★★★★★★」sleep()★★★★★★★★★★★★★★★★★★?

제 이해로는wait()하지만 -ing은 CPU 사이클을 사용합니다.sleep()ing은 CPU 사이클을 소비하지 않습니다.

왜 우리는 둘 다 가지고 있지? wait() ★★★★★★★★★★★★★★★★★」sleep()이 낮은 구현이 낮은 수준에서 어떻게 달라집니까?

A는 대기 중인 모니터 상의 다른 스레드 호출에 의해 "웨이크업"할 수 있지만,는 할 수 없습니다.또,wait (그리고)notify은(는).synchronized에서는, 「」를 참조해 주세요.sleep지지않않않않다다

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

이 시점에서 현재 실행 중인 스레드가 대기하고 모니터를 해제합니다.다른 스레드로도 충분합니다.

synchronized (mon) { mon.notify(); }

)mon오브젝트)와 첫 번째 스레드(모니터상에서 대기하고 있는 유일한 스레드)가 기동합니다.

모니터에 여러 스레드가 대기하고 있는 경우에도 호출할 수 있습니다.이것에 의해, 모든 스레드가 기동합니다.단, 1개의 스레드만 모니터를 잡을 수 있습니다(이것에 주의:wait synchronized차단) 및 계속합니다.다른 것은 모니터의 잠금을 획득할 때까지 차단됩니다.

는 '보다 낫다'라고 것입니다.wait스스로(즉, 오브젝트의 모니터에서 대기)를 호출하는 동안sleep에 있습니다.

하지만 또 다른 포인트는 가짜 깨우기가wait(즉, 대기하고 있던 스레드가 뚜렷한 이유 없이 재개됩니다).다음과 같은 조건으로 회전하는 동안에는 항상 회전해야 합니다.

synchronized {
    while (!condition) { mon.wait(); }
}

아직 언급되지 않은 중요한 차이점 중 하나는 스레드가 sleeve 상태일 때 유지되는 잠금이 해제되지 않고 대기 상태가 되면 오브젝트에 대한 잠금이 해제된다는 것입니다.wait()가 호출됩니다.

synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}


synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}

게시물이 도움이 되었습니다.그것이 와의 차이를 둔다.Thread.sleep(),Thread.yield() , , , , 입니다.Object.wait()적적: :

이 모든 것이 최종적으로 OS의 스케줄러로 이행해, 프로세스와 스레드에 타임 라이센스를 전달합니다.

sleep(n)"타임슬라이스를 다 썼으니 적어도 n밀리초 동안은 다른 타임슬라이스를 주지 말아주세요."라고 말합니다.OS는 요청된 시간이 경과할 때까지 sleeve 스레드의 스케줄도 시도하지 않습니다.

yield()"타임슬라이스는 끝났지만 아직 일이 있어요."OS는 즉시 스레드에 다른 타임슬라이스를 주거나 다른 스레드를 주거나 방금 포기한 스레드를 CPU에 처리할 수 있습니다.

wait()"타임슬라이스는 끝났어. 누군가 notify()를 호출할 때까지 더 이상 시간을 주지 마세요.와 마찬가지로sleep()가 OS를 호출하지 한 을 설정하려고 notify()(또는 몇 가지 다른 웨이크업 시나리오 중 하나가 발생합니다).

또한 스레드는 블로킹 IO를 수행하거나 다른 몇 가지 상황에서 나머지 시간 단축을 수행합니다.는 마치 한다.yield()다른 프로세스를 실행할 수 있도록 호출되었습니다.

없다yield(), 인 태스크가 높은 " " " " " " "를 합니다.yield() 시스템 응답성이 향상될 가능성이 있습니다(시간을 들여 콘텍스트스위치는 OS뿐만 아니라 OS에 대해서도 무료가 아닙니다).항상 그렇듯이 관심 있는 목표에 대해 측정하고 테스트합니다.

여기에는 많은 답이 있지만 나는 어떤 의미론적인 차이도 찾을 수 없었다.

스레드 자체에 관한 것이 아닙니다.두 방법 모두 매우 다른 사용 사례를 지원하므로 필요합니다.

sleep()슬리브컨텍스트만 압축하고 미리 정의된 시간 동안 실행을 중지합니다.따라서 종료 시간 전에 깨우려면 스레드 참조를 알아야 합니다.이것은 멀티 스레드 환경에서는 일반적인 상황이 아닙니다.주로 시간 동기화(예: 정확히 3.5초 만에 깨움) 및/또는 하드 코드 공정성(잠시 자고 다른 스레드가 작동하도록)에 사용됩니다.

wait()는, 보존된 참조가 없는 스레드에 통지할 수 있는(또는 메시지) 동기 메커니즘입니다..wait== 및 구독notify()== () ()를 사용하여 되지 않을 수 기본적으로 notify()를 사용하여 메시지를 보냅니다(전혀 수신되지 않을 수 있으며 일반적으로는 상관하지 않습니다).

은 「이렇게」, 「이렇게」를 합니다.sleep() 및 ""에 대한 설명하겠습니다.wait()멀티태스킹 동기화가 가능합니다.

기본 OS에서도 동일한 방식으로 구현될 수 있고 전혀 구현되지 않을 수도 있습니다(이전 버전의 Java에서는 실제 멀티스레딩이 없었으므로 일부 소규모 VM에서도 구현되지 않을 수 있습니다).Java는 VM에서 실행되므로 코드가 실행되는 VM/OS/HW에 따라 다르게 변환됩니다.

여,, 는는몇rencesrencesrencesrencesrencesrencesrencesrences 의 중요한 차이점을 몇 나열했습니다.wait() ★★★★★★★★★★★★★★★★★」sleep()★★★★★★★★★★★★★★★★★★.
PS:또한 링크를 클릭하여 라이브러리 코드를 확인하십시오(내부 작업, 이해를 돕기 위해 조금만 재생).

대기()

  1. wait()을 합니다.
  2. wait() 하는 것이 바로 of of of니다다다 of of of of of'Object를 누릅니다
  3. wait()방식입니다.public final void wait() throws InterruptedException { //...}
  4. wait()notify() ★★★★★★★★★★★★★★★★★」notifyAll()★★★★★★★★★★★★★★★★★★.
  5. wait()잘못된 알람을 처리하려면 루프에서 메서드를 호출해야 합니다.

  6. wait()즉방식 블록에서 메서드를 해야 합니다. 방식(synchronized 또는 block)이 .그렇지 않으면 메서드가 느려집니다.IllegalMonitorStateException

sleep()

  1. sleep()메서드는 잠금을 해제하지 않습니다.
  2. sleep() 하는 것이 바로 of of of니다다다 of of of of of'java.lang.Thread를 누릅니다
  3. sleep()메서드입니다.public static void sleep(long millis, int nanos) throws InterruptedException { //... }
  4. 「」가 됩니다.sleep()료했습습니니다
  5. sleep()루프에서 호출하지 않는 것이 좋습니다(아래 코드 참조).
  6. sleep()것은 .특별한 요건은 없습니다.

참고 자료: 대기 및 절전 기능의 차이

대기 및 절전 메서드를 호출하기 위한 코드 조각

synchronized(monitor){
    while(condition == true){ 
        monitor.wait()  //releases monitor lock
    }

    Thread.sleep(100); //puts current thread on Sleep    
}

thread transition to different thread states

wait()와 sleep()의 차이

  • 근본적인 차이는 이다.wait()는, 으로, 「비정적인 방법」입니다.Object ★★★★★★★★★★★★★★★★★」sleep()으로, 을 사용합니다.Thread.
  • 가장 큰 차이점은 이라는 것이다.wait() 잠금을 해제하는 sleep()기다리는 동안 잠금이 해제되지 않습니다.
  • wait()는, 네트워크간의 통신에 사용됩니다.sleep()일반적으로 실행 시 일시 중지를 도입하기 위해 사용됩니다.
  • wait()내부 동기에서 호출해야 합니다.그렇지 않을 경우, 수신할 수 있습니다.IllegalMonitorStateException와 동시에 , 「」를 참조해 주세요.sleep()어디든지 전화할 수 있다.
  • wait()해야 돼요.notify() ★★★★★★★★★★★★★★★★★」notifyAll()★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.sleep(),스레드는 지정된 시간 간격 후에 확실하게 시작됩니다.

유사점들

  • 다 현재 스레드를 실행 불가 상태로 만듭니다.
  • 둘 다 네이티브 방식입니다.

wait와 sleep에 대해 작업한 후 결론짓는 몇 가지 차이점이 있습니다.먼저 wait()와 sleep()을 사용하여 샘플을 확인합니다.

1: wait() 및 sleep() 사용:

synchronized(HandObject) {
    while(isHandFree() == false) {
        /* Hand is still busy on happy coding or something else, please wait */
        HandObject.wait();
    }
}

/* Get lock ^^, It is my turn, take a cup beer now */
while (beerIsAvailable() == false) {
    /* Beer is still coming, not available, Hand still hold glass to get beer,
       don't release hand to perform other task */
    Thread.sleep(5000);
}

/* Enjoy my beer now ^^ */
drinkBeers();

/* I have drink enough, now hand can continue with other task: continue coding */
setHandFreeState(true);
synchronized(HandObject) {
    HandObject.notifyAll();
}

몇 가지 주요 사항을 명확히 합니다.

  1. 호출 시간:
    • wait(): HandObject 객체를 유지하는 현재 스레드 호출
    • sleep(): Call on Thread 실행 태스크 get beer (클래스 메서드가 현재 실행 중인 스레드에 영향을 미칩니까)
  2. 동기화됨:
    • wait(): 동기화된 멀티 스레드액세스가 같은 오브젝트(HandObject)(같은 오브젝트 HandObject 상에서 여러 스레드(스레드 Execute Coding, 스레드 execute get beer)간의 통신이 필요한 경우)
    • sleep(): 실행을 계속하기 위해 대기하는 조건(대기 중 맥주 사용 가능)
  3. 잠금 유지:
    • wait(): 다른 개체에 대해 잠금을 해제합니다(HandObject는 무료이며 다른 작업을 수행할 수 있습니다).
    • sleep(): 최소 t회(또는 인터럽트할 때까지) 동안 잠금을 유지합니다(내 작업이 아직 완료되지 않았습니다.잠금을 계속하고 상태를 계속 기다립니다).
  4. 웨이크업 조건:
    • wait(): 콜이 notify()될 때까지 오브젝트에서 notifyAll()
    • sleep(): 최소 시간이 만료되거나 콜이 중단될 때까지
  5. 그리고 마지막 포인트는 estani가 다음을 나타낼 때 사용합니다.

보통 시간 동기화에는 sleep()을 사용하고 멀티태스킹 동기에는 wait()를 사용합니다.

제가 틀렸다면 정정해 주세요.

이것은 매우 간단한 질문입니다.두 방법 모두 전혀 다른 용도를 가지고 있기 때문입니다.

주요 차이점은 sleep 상태에서 잠금 또는 모니터를 해제할 때까지 기다리는 것입니다.잠금 또는 모니터는 대기 중에 해제되지 않습니다.Wait는 스레드 간 통신에 사용되며 sleep은 실행 시 일시 중지를 도입하기 위해 사용됩니다.

이것은 단지 명확하고 기본적인 설명일 뿐, 그 이상을 원한다면 계속 읽어보십시오.

wait()는 대기 , 되지 않습니다.이 경우 메서드 스레드는 상태가 됩니다.notify() "method")notifyAll() and 、 and and and and and and and and and 、 、 、 the the the the the에 액세스하려면 동기 잠금 합니다.wait() ★★★★★★★★★★★★★★★★★」notify() ★★★★★★★★★★★★★★★★★」notifyAll()그리고 있어요.wait()메서드는 스레드가 대기 상태가 되면 해당 스레드를 웨이크업하기 위해 다른 스레드가 필요하기 때문에 인터스레드 통신에 사용됩니다.

, ★★★★★★★★★의 경우sleep()이 방법은 프로세스를 몇 초 또는 원하는 시간 동안 유지하기 위해 사용됩니다. 당신은 도 받지 되기 입니다.notify() ★★★★★★★★★★★★★★★★★」notifyAll()그 스레드를 되찾는 방법.또는 그 스레드를 다시 호출하는 데 다른 스레드가 필요하지 않습니다.를 들어 후 처럼 몇 초 경우 경우처럼, 이 경우 할 수 .sleep()★★★★★★ 。

인터뷰에서 자주 또 은 다음과 같습니다.sleep()Thread 및 " " " 。wait()Object를 누릅니다

'이것들'의 차이점입니다.sleep() ★★★★★★★★★★★★★★★★★」wait().

또한 두 방법 모두 체크된 문장이므로 캐치 또는 던지기를 시도하여 접근해야 합니다.

이것이 당신에게 도움이 되길 바랍니다.

출처 : http://www.jguru.com/faq/view.jsp?EID=47127

Thread.sleep() 는 현재 스레드를 일정 시간 동안 "Not Runnable" 상태로 보냅니다.스레드는 자신이 취득한 모니터를 유지합니다.즉, 스레드가 현재 동기화된 블록 또는 메서드에 있는 경우 다른 스레드는 이 블록 또는 메서드에 들어갈 수 없습니다.다른 스레드가 호출하면 수면 스레드가 깨집니다.

sleep은 정적 방법이며, 이는 항상 현재 스레드(sleep 방법을 실행하는 스레드)에 영향을 미친다는 것을 의미합니다. 있는 는 전화하는 입니다.t.sleep()여기서 t는 다른 스레드입니다.그 경우에도 t 스레드가 아닌 현재 스레드가 sleep 상태가 됩니다.

t.suspend() 는 권장되지 않습니다.이를 사용하면 현재 스레드 이외의 스레드를 정지할 수 있습니다.서스펜드 스레드에서는 모든 모니터가 유지되며, 이 상태는 인터럽트할 수 없기 때문에 교착 상태가 되기 쉽습니다.

object.wait() 현재 스레드를 "Not Runnable" 상태로 보냅니다.sleep()오브젝트를 잠금 오브젝트'라고.잠깐만요'이 객체를 "잠금 객체"라고 부릅니다.★★의 앞lock.wait()잠금오브젝트에서해야 합니다.「 」 、 「 」 、 「 」 、 「 」 。wait()그런 다음 이 잠금을 해제하고 잠금과 관련된 "대기 목록"에 스레드를 추가합니다., 해, 「Call 」(콜)을 발신할 수 있습니다.lock.notify()그러면 원래 대기 스레드가 웨이크업됩니다.으로는 ★★★★★★★★★★★★★★★★★」wait()/notify()~와 sleep()/interrupt()sleep 스레드에 대한 직접 포인터가 필요하지 않고 공유 잠금 오브젝트에 대한 직접 포인터만 필요합니다.

기다리는 것과 자는 것은 다르다.

  • »sleep()스레드가 지정된 기간 동안 작동을 중지합니다.
  • »wait()스레드는 일반적으로 다른 스레드에 의해 대기 중인 객체에 알림이 전달될 때까지 작동을 중지합니다.

sleep입니다.Thread,wait입니다.Object, (그래서)wait/notify(모니터를 사용하여) Java에서 공유 데이터를 동기화하는 기술입니다만,sleep는 스레드 자체를 일시 중지하는 단순한 방법입니다.

sleep()은 프로세스를 몇 초 또는 원하는 시간 동안 유지하기 위해 사용되는 메서드입니다.wait() 메서드 스레드가 대기 상태가 되어 notify() 또는 notifyAll()을 호출할 때까지 자동으로 돌아오지 않습니다.

주요 차이점은 wait()는 잠금 또는 모니터를 해제하고 sleep()은 대기 중 잠금 또는 모니터를 해제하지 않는다는 입니다.wait는 스레드 간 통신에 사용되며 sleep은 일반적으로 실행 시 일시 중지를 도입하기 위해 사용됩니다.

Thread.sleep()은 현재 스레드를 일정 시간 동안 "Not Runnable" 상태로 보냅니다.스레드는 취득한 모니터를 유지합니다.즉, 스레드가 현재 동기화된 블록 또는 메서드에 있는 경우 다른 스레드는 이 블록 또는 메서드에 들어갈 수 없습니다.다른 스레드가 t.interrupt()를 호출하면 슬립 스레드가 웨이크업됩니다.sleep은 정적 방법이며, 이는 항상 현재 스레드(sleep 방법을 실행하는 스레드)에 영향을 미친다는 것을 의미합니다.일반적인 실수는 t.sleep()을 호출하는 것입니다.여기서 t는 다른 스레드입니다.그 경우에도 sleep 하는 것은 t 스레드가 아니라 현재 스레드입니다.

object.wait()는 현재 스레드를 sleep()과 같이 "Not Runnable" 상태로 보냅니다.Wait는 스레드가 아닌 객체 상에서 호출됩니다.이 객체를 "잠금 객체"라고 부릅니다.lock.wait()를 호출하기 전에 현재 스레드가 잠금 개체에서 동기화되어야 합니다.wait()는 이 잠금을 해제하고 해당 스레드를 잠금과 관련된 "대기 목록"에 추가합니다.나중에 다른 스레드가 같은 잠금오브젝트로 동기화되어 lock.notify()를 호출할 수 있습니다.그러면 원래 대기 스레드가 웨이크업됩니다.기본적으로 wait()/notify()는 sleep()/interrup()과 같으며 활성 스레드만 sleep 스레드에 대한 직접 포인터가 필요하지 않고 공유 잠금 개체에만 필요합니다.

synchronized(LOCK) {   
   Thread.sleep(1000); // LOCK is held
}

synchronized(LOCK) {   
   LOCK.wait(); // LOCK is not held
}

위의 모든 점을 분류합니다.

Call on:

  • wait(): 객체에 대한 호출.현재 스레드는 잠금 객체에 대해 동기화해야 합니다.
  • sleep(): 스레드를 호출합니다.현재 항상 스레드를 실행하고 있습니다.

Synchronized:

  • wait(): 동기화된 여러 스레드가 동일한 개체에 하나씩 액세스하면
  • sleep(): 동기화된 여러 스레드가 sleep 스레드의 sleep over를 기다리는 경우.

Hold lock:

  • wait(): 잠금을 해제하여 다른 개체를 실행할 수 있도록 합니다.
  • sleep(): 타임아웃이 지정되거나 누군가가 인터럽트를 했을 경우 최소 t회 이상 잠금을 유지합니다.

Wake-up condition:

  • wait(): 콜이 notify()될 때까지 오브젝트에서 notifyAll()
  • sleep(): 최소 시간이 만료되거나 콜이 중단될 때까지

Usage:

  • sleep(): 시간 동기화 및;
  • wait(): 멀티태스킹 동기용.

참조:diff

간단히 말하면, wait is wait 다른 스레드가 호출될 때까지 대기하는 반면 sleep은 지정된 기간 동안 "다음 문을 실행하지 않음"입니다.

또한 sleep은 스레드클래스의 스태틱메서드로 스레드 상에서 동작하는 반면 wait()는 오브젝트클래스로 호출됩니다.

또 하나의 포인트는 어떤 오브젝트에 대해 wait를 호출하면 관련된 스레드가 오브젝트를 동기화한 후 대기합니다.:)

wait ★★★★★★★★★★★★★★★★★」sleep방법은 매우 다릅니다.

  • sleep '업'할 방법이 없어
  • 한편, 다른 스레드 호출 또는 에 의한 대기시간 중에 "업"하는 방법이 있습니다.

보니 그, 그 점은 헷갈리네요.sleep이고, 「」입니다.wait또는 Win API와 같습니다.

이 투고부터 : http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/

wait() 메서드.

1) wait() 메서드를 호출하는 스레드는 보유하고 있는 잠금을 해제합니다.

2) 다른 스레드가 같은 잠금으로 notify() 메서드 또는 notifyAll() 메서드를 호출한 후 스레드가 잠금을 회복합니다.

3) wait() 메서드는 동기화된 블록 내에서 호출해야 합니다.

4) wait() 메서드는 항상 오브젝트에서 호출됩니다.

5) 대기 스레드는 notify() 메서드 또는 notifyAll() 메서드를 호출하여 다른 스레드로 웨이크업할 수 있습니다.

6) wait() 메서드를 호출하려면 스레드에 객체 잠금이 있어야 합니다.

sleep() 메서드

1) sleep() 메서드를 호출하는 스레드는 보유하고 있는 잠금을 해제하지 않습니다.

2) sleep() 메서드는 동기화된 블록 내 또는 외부에서 호출할 수 있습니다.

3) sleep() 메서드는 항상 스레드로 호출됩니다.

4) 수면사는 다른 스레드로 깨울 수 없습니다.이렇게 하면 스레드가 인터럽트됩니다.예외.

5) sleep() 메서드를 호출하기 위해 스레드에 오브젝트 잠금이 필요 없습니다.

여기서 wait()는 다른 스레드에 의해 통지될 때까지 대기 상태가 되지만 sleep()은 시간이 걸립니다.그 후, 자동적으로 Ready 상태로 이행합니다.

  1. wait()입니다.Object를 누릅니다
    sleep()입니다.Thread를 누릅니다

  2. sleep()는, 스레드를 「」에 할 수 있도록 .sleep이치노
    상태가 sleep 상태가 됩니다.it doesn’t release the lock

  3. wait()를 사용하면 가 잠금을 해제하고 " 해제"를 할 수 .goes to suspended state.
    활성화 은 이 실입니다.notify() ★★★★★★★★★★★★★★★★★」notifAll()방법

sleep/interrupt와 wait/notify의 잠재적인 큰 차이는 다음과 같습니다.

  • 가 호출하면 항상 예외가 발생합니다(: 중단됨).예외)에 비해
  • 는 호출하지 않습니다.

필요하지 않을 때 예외를 생성하는 것은 비효율적입니다.서로 고속으로 통신하는 스레드가 있는 경우 인터럽트를 항상 호출하면 많은 예외가 발생하므로 CPU가 완전히 낭비됩니다.

정답입니다. sleep()을 실행하면 해당 스레드가 "sleep" 상태가 되고 CPU가 꺼지고 다른 스레드(컨텍스트 스위칭이라고도 함)를 처리합니다.대기하면 CPU는 현재 스레드를 계속 처리합니다.

CPU를 사용하지 않는 동안 다른 사람에게 CPU를 사용하게 하는 것이 현명해 보일 수 있지만 실제로는 컨텍스트 전환에 대한 오버헤드가 있습니다.슬립 시간에 따라서는 단순히 스레드를 몇 밀리초 동안 사용하지 않는 것보다 CPU 사이클에서 스레드를 전환하는 것이 더 비쌀 수 있습니다.

또한 sleep은 컨텍스트 전환을 강제합니다.

또한 일반적으로 콘텍스트 전환을 제어할 수 없습니다.[대기]에서 OS는 다른 스레드 처리를 선택할 수 있습니다.

그 방법들은 다른 것들에 사용된다.

Thread.sleep(5000);   // Wait until the time has passed.

Object.wait();        // Wait until some other thread tells me to wake up.

Thread.sleep(n)은 중단될 수 있지만 Object.wait()에 통지해야 합니다.최대 대기 시간을 지정할 수 있습니다.Object.wait(5000) 될 것 요.wait 에, 에, 에, 에,sleep하지만 자물쇠는 신경써야 해

어느 메서드도 sleeve/waiting 중에 CPU를 사용하지 않습니다.

메서드는 네이티브 코드를 사용하여 구현되며 유사한 구성을 사용하지만 동일한 방식으로 구현되지 않습니다.

직접 찾아보세요.네이티브 메서드의 소스 코드를 사용할 수 있습니까?파일/src/share/vm/prims/jvm.cpp★★★★★★★★★★★★。

Wait()와 sleep()의 차이점

Thread.sleep() 작업이 완료되면 모든 사용자에게 잠금을 해제합니다.자물쇠를 아무에게도 풀지 않을 때까지요

  Sleep() take the key, its never release the key to anyone, when its work completed then only its release then only take the key waiting stage threads.

Object.wait() 대기 스테이지가 되면 키가 해제되고 파라미터에 따라 몇 초간 대기합니다.

예:

커피를 오른손에 들고, 같은 손을 가진 다른 사람을 잡고, 언제 내려놓고, 또 같은 타입의 물건만 가져갈 것인가.이것은 sleep()입니다. 당신은 아무것도 하지 않고 잠만 자고 있습니다.나도 마찬가지야.

wait(기다림)이 다운되어 대기 중에 다른 수단을 취할 때, 즉 대기입니다.

플레이어와 같은 시스템 내의 영화 또는 어떤 것을 재생하는 경우, 한 번에 한 개 이상 재생할 수 없습니다.그것은 여기서 닫은 후 다른 영화 또는 노래를 선택할 때 wait라고 불리는 것입니다.

wait하고 ""를 해제합니다.sleep그렇지 않다.대기 상태의 스레드는 즉시 웨이크업할 수 있습니다.notify ★★★★★★★★★★★★★★★★★」notifyAll호출됩니다.하지만 만약의 경우sleep스레드는 잠금을 유지하며 수면 시간이 끝난 후에만 사용할 수 있습니다.

sleep()method를 지정하면 현재 스레드가 지정된 시간 동안 실행 상태에서 블록 상태로 이동합니다.현재 스레드에 개체의 잠금이 있는 경우 해당 스레드는 계속 유지됩니다. 즉, 다른 스레드는 해당 클래스 개체에서 동기화된 메서드를 실행할 수 없습니다.

wait()method를 지정하면 현재 스레드는 지정된 시간 동안 또는 통지될 때까지 블록 상태가 되지만 이 경우 스레드에 의해 오브젝트의 잠금이 해제됩니다(즉, 다른 스레드는 호출 객체의 동기화된 메서드를 실행할 수 있습니다).

제 생각에 두 메커니즘의 주요 차이점은 sleep/interrupt가 스레드를 처리하는 가장 기본적인 방법인 반면 wait/notify는 스레드 간 통신을 보다 쉽게 하기 위한 추상화입니다.이는 수면/중단은 무엇이든 할 수 있지만 이 특정 작업은 더 어렵다는 것을 의미합니다.

대기/통지가 더 적합한 이유는 무엇입니까?다음은 개인적인 고려 사항입니다.

  1. 중앙집중화를 강제합니다.단일 공유 개체를 가진 스레드 그룹 간의 통신을 조정할 수 있습니다.이렇게 하면 작업이 많이 간소화됩니다.

  2. 동기화가 강제됩니다.이는 프로그래머가 콜을 랩하여 동기화된 블록으로 대기/통지하도록 하기 때문입니다.

  3. 스레드 시작점 및 번호와는 무관합니다.이 방법을 사용하면 다른 스레드를 편집하거나 기존 스레드를 추적하지 않고 임의로 스레드를 추가할 수 있습니다.sleep/interrupt를 사용하는 경우 먼저 sleep 스레드에 대한 참조를 유지한 후 하나씩 손으로 중단해야 합니다.

이것을 설명하는 데 좋은 실생활의 예는 고전적인 레스토랑과 직원들이 그들 사이에서 의사소통하기 위해 사용하는 방법이다.웨이터는 손님의 요구를 중앙의 장소(코르크판, 테이블 등)에 남겨두고 벨을 울리면 주방의 종업원이 와서 받는다.코스가 준비되면 주방 직원이 벨을 다시 눌러 웨이터들이 알 수 있도록 하고 손님들에게 안내합니다.

sleep에 대한 예에서는 잠금을 해제하지 않고 대기하면 해제됩니다.

다음 두 가지 클래스가 있습니다.

  1. [Main] : 메인 메서드와 2개의 스레드가 포함되어 있습니다.
  2. Singleton : 이것은 getInstance()와 getInstance(부울리언 isWait)의 2가지 정적 메서드를 가진 싱글톤 클래스입니다.

    public class Main {
    
    private static Singleton singletonA = null;
    private static Singleton singletonB = null;
    
    public static void main(String[] args) throws InterruptedException {
    
    Thread threadA = new Thread() {
        @Override
        public void run() {
    
            singletonA = Singleton.getInstance(true);
    
        }
    };
    
    Thread threadB = new Thread() {
        @Override
        public void run() {
            singletonB = Singleton.getInstance();
    
            while (singletonA == null) {
                System.out.println("SingletonA still null");
            }
    
            if (singletonA == singletonB) {
                System.out.println("Both singleton are same");
            } else {
                System.out.println("Both singleton are not same");
            }
    
        }
    };
    
    threadA.start();
    threadB.start();
    
     }
    }
    

그리고.

public class Singleton {

    private static Singleton _instance;

    public static Singleton getInstance() {

    if (_instance == null) {
        synchronized (Singleton.class) {
            if (_instance == null)
                _instance = new Singleton();
        }
    }
    return _instance;

}

public static Singleton getInstance(boolean isWait) {

    if (_instance == null) {
        synchronized (Singleton.class) {
            if (_instance == null) {
                if (isWait) {
                    try {
                        // Singleton.class.wait(500);//Using wait
                        Thread.sleep(500);// Using Sleep
                        System.out.println("_instance :"
                                + String.valueOf(_instance));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                _instance = new Singleton();
            }
        }
    }
    return _instance;

 }
}

다음 예시를 실행하면 다음과 같은 출력이 표시됩니다.

_instance :null
Both singleton are same

여기서 스레드A와 스레드B에 의해 작성된 싱글턴 인스턴스는 동일합니다.스레드A가 잠길 때까지 스레드B가 밖에서 기다리고 있다는 뜻입니다.

이제 스레드에 주석을 달아 Singleton.java를 변경합니다.sleep(500), 메서드 및 주석 해제 Singleton.class.wait(500);여기서 Singleton.class.wait(500); 메서드 threadA는 모든 취득 잠금을 해제하고 "Non Runnable" 상태로 이행하며 스레드B는 동기화된 블록에 입력하도록 변경됩니다.

다시 실행:

SingletonA still null
SingletonA still null
SingletonA still null
_instance :com.omt.sleepwait.Singleton@10c042ab
SingletonA still null
SingletonA still null
SingletonA still null
Both singleton are not same

여기서 스레드A와 스레드B가 작성한 싱글턴 인스턴스는 동일하지 않습니다.이는 스레드B가 동기화된 블록에 입력하도록 변경되어 500밀리초 후에 스레드A가 마지막 위치에서 시작하여 싱글턴 개체를 하나 더 생성했기 때문입니다.

동기화된 블록에서 호출해야 합니다. wait()메서드는 항상 동기화된 블록에서 호출됩니다. wait()메서드는 오브젝트 모니터를 호출하는 오브젝트보다 먼저 잠가야 합니다.그렇지만sleep()메서드는 동기화된 외부 블록에서 호출할 수 있습니다. sleep()메서드에는 개체 모니터가 필요하지 않습니다.

Iflogal Monitor State Exception : 이 경우wait()오브젝트 잠금을 취득하지 않고 메서드가 호출됩니다.IllegalMonitorStateException실행 시 느려지지만sleep()method는 이러한 예외를 발생시키지 않습니다.

다음 클래스에 속합니다. wait()메서드는 에 속합니다.java.lang.Object클래스 하지만sleep()메서드는 에 속합니다.java.lang.Thread학급.

오브젝트 또는 스레드에서 호출됩니다. wait()메서드는 오브젝트에서 호출되지만sleep()메서드는 객체가 아닌 스레드에서 호출됩니다.

스레드 상태 : 시기wait()메서드는 오브젝트 상에서 호출됩니다.오브젝트의 모니터를 보유하고 있던 스레드는 실행 상태에서 대기 상태로 전환되며 실행 가능한 상태로 돌아갈 수 있는 것은 다음 경우뿐입니다.notify()또는notifyAll()메서드가 해당 개체에서 호출됩니다.그리고 나중에 스레드 스케줄러는 해당 스레드가 실행 가능 상태에서 실행 상태로 전환되도록 스케줄링합니다.언제sleep()는 스레드 상에서 호출되며 실행 상태에서 대기 상태로 전환되며 sleep 시간이 되면 실행 가능한 상태로 돌아갈 수 있습니다.

동기화된 블록에서 호출된 경우:wait()메서드는 스레드가 오브젝트 잠금을 탈퇴합니다.그렇지만sleep()동기화된 블록에서 메서드가 호출되거나 메서드 스레드가 객체 잠금을 남기지 않습니다.

자세한 내용은 이쪽

wait() 메서드의 Oracle 문서 페이지에서Object:

public final void wait()
  1. 다른 스레드가 호출될 때까지 현재 스레드가 대기하도록 합니다.notify()메서드 또는notifyAll()메서드를 지정합니다.즉, 이 메서드는 단순히 콜을 실행하는 것처럼 동작합니다.wait(0).
  2. 현재 스레드가 이 개체의 모니터를 소유해야 합니다.스레드는 이 모니터의 소유권을 해제하고 다른 스레드가 이 개체의 모니터에서 대기 중인 스레드에 웨이크업 알림을 보낼 때까지 기다립니다.
  3. 인터럽트 및 스플리어스 웨이크업 가능
  4. 이 메서드는 이 개체 모니터의 소유자인 스레드에서만 호출해야 합니다.

이 방법은 던진다.

  1. IllegalMonitorStateException- 현재 스레드가 개체 모니터의 소유자가 아닌 경우.

  2. InterruptedException- 현재 스레드가 알림을 대기하기 전 또는 기다리는 동안 스레드가 현재 스레드를 중단한 경우.이 예외가 발생하면 현재 스레드의 중단된 상태가 지워집니다.

sleep() 메서드의 Oracle 문서 페이지에서Thread클래스:

public static void sleep(long millis)
  1. 시스템 타이머 및 스케줄러의 정밀도와 정확도에 따라 현재 실행 중인 스레드가 지정된 밀리초 동안 sleep(일시적으로 실행 중지) 상태가 됩니다.
  2. 스레드는 모니터의 소유권을 잃지 않는다.

이 방법은 다음과 같습니다.

  1. IllegalArgumentException- millis 값이 음수인 경우

  2. InterruptedException- 현재 스레드를 중단한 스레드가 있는지 확인합니다.이 예외가 발생하면 현재 스레드의 중단된 상태가 지워집니다.

기타 주요 차이점:

wait()는, 스태틱 방식과는 달리, 비 스태틱 방식(스태틱 방식)입니다.sleep()(클래스 방식).

wait()동기화된 메서드 내에서 제공됩니다.sleep()비동기화된 메서드 내에서 지정되는 이유는 다음과 같습니다.wait()method는 오브젝트에 대한 잠금을 해제합니다.sleep()또는yield()를 릴리스 합니다.lock().

  • 이 메서드는 현재 스레드를 최대 1초까지 sleeve 상태로 만듭니다.
    • 또는 메서드 호출을 수신하면 스레드는 1초 미만으로 sleep 상태가 될 수 있습니다.
  • 를 호출하면 현재 스레드가 정확히1초간 sleeve 상태가 됩니다.
    • 또한 sleep 스레드는 리소스를 잠그지 않습니다.하지만 기다리는 실타래는 그렇다.

사실, Java 문서에는 이 모든 것이 명확하게 기술되어 있습니다(하지만 저는 답을 읽고 나서야 깨달았습니다).

http://docs.oracle.com/javase/8/docs/api/index.html :

wait() - 현재 스레드가 이 개체의 모니터를 소유해야 합니다.스레드는 이 모니터의 소유권을 해제하고 알림 메서드 호출 또는 알림을 통해 다른 스레드가 이 개체의 모니터에서 대기 중인 스레드에 알림을 보낼 때까지 기다립니다.모든 방법.그런 다음 스레드는 모니터 소유권을 다시 취득할 수 있을 때까지 기다렸다가 실행을 재개합니다.

sleep() - 현재 실행 중인 스레드가 지정된 시간(밀리초) 동안 sleep(일시적으로 실행 중지) 상태가 됩니다.시스템 타이머와 스케줄러의 정밀도와 정확도가 영향을 받습니다.스레드는 모니터의 소유권을 잃지 않는다.

언급URL : https://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep

반응형