1. 개요
이 짧은 기사에서는 핵심 Java 의 표준 sleep () 및 wait () 메소드를 살펴보고 그 차이점과 유사점을 이해합니다.
2. 대기 와 수면의 일반적인 차이점
간단히 말해 wait () 는 스레드 동기화에 사용되는 인스턴스 메서드입니다.
java.lang.Object에 바로 정의되어 있으므로 모든 객체에서 호출 할 수 있지만 동기화 된 블록에서만 호출 할 수 있습니다 . 다른 스레드가 뛰어 들어 잠금을 획득 할 수 있도록 객체에 대한 잠금을 해제합니다.
반면 Thread.sleep () 은 모든 컨텍스트에서 호출 할 수있는 정적 메서드입니다. Thread.sleep () 은 현재 스레드를 일시 중지하고 잠금을 해제하지 않습니다.
다음은 작동중인이 두 가지 핵심 API에 대한 매우 단순한 초기 모습입니다.
private static Object LOCK = new Object(); private static void sleepWaitExamples() throws InterruptedException { Thread.sleep(1000); System.out.println( "Thread '" + Thread.currentThread().getName() + "' is woken after sleeping for 1 second"); synchronized (LOCK) { LOCK.wait(1000); System.out.println("Object '" + LOCK + "' is woken after" + " waiting for 1 second"); } }
이 예제를 실행하면 다음 출력이 생성됩니다.
스레드 'main'은 1 초 동안 수면 후 깨어납니다.
1 초간 기다린 후 '[email protected]'개체가 깨어납니다.
3. 깨우기 대기 및 수면
sleep () 메서드를 사용할 때 스레드는 중단되지 않는 한 지정된 시간 간격 후에 시작됩니다.
들어 대기 () , 처리까지 깨어은 좀 더 복잡하다. 우리는 중 하나를 호출하여 스레드를 깨울 수 통지 () 또는 가는 notifyAll () 에 기다렸다되고있는 모니터 방법.
사용 의 notifyAll () 대신 (통지) 는 대기 상태에있는 모든 스레드를 해제하고자 할 때. 마찬가지로까지 대기 () 메소드 자체 ) (통지 와 의 notifyAll () 동기화 컨텍스트에서 호출되어야한다.
예를 들어, 기다릴 수있는 방법은 다음과 같습니다.
synchronized (b) { while (b.sum == 0) { System.out.println("Waiting for ThreadB to complete..."); b.wait(); } System.out.println("ThreadB has completed. " + "Sum from that thread is: " + b.sum); }
그리고 다음 은 모니터에서 notify () 를 호출하여 다른 스레드가 대기중인 스레드 를 깨울 수있는 방법입니다 .
int sum; @Override public void run() { synchronized (this) { int i = 0; while (i < 100000) { sum += i; i++; } notify(); } }
이 예제를 실행하면 다음 출력이 생성됩니다.
ThreadB가 완료되기를 기다리는 중…
ThreadB가 완료되었습니다. 해당 스레드의 합계 : 704982704
4. 결론
이것은 자바에서 대기 와 수면 의 의미에 대한 빠른 입문서 입니다.
일반적으로 한 스레드의 실행 시간을 제어 하려면 sleep () 을 사용 하고 다중 스레드 동기화를 위해서는 wait () 를 사용해야 합니다. 당연히 기본을 잘 이해 한 후에는 더 많은 것을 탐구 할 수 있습니다.
항상 그렇듯이 GitHub에서이 기사에 제공된 예제를 확인할 수 있습니다.