Java에서 대기와 절전의 차이점

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에서이 기사에 제공된 예제를 확인할 수 있습니다.