HOWTO · Java

Java에서 wait() 및 notify() 메서드 사용

이 자습서에서는 Java의 wait() 및 notify() 메서드를 보여줍니다.

이 페이지의 내용

이 튜토리얼은 Java의 wait() 및 notify() 메소드를 보여줍니다.

Java에서 wait() 및 notify() 메소드 사용

wait() 및 notify() 메서드는 스레드가 특정 조건이 충족될 때까지 대기할 수 있는 메커니즘을 제공합니다. 예를 들어 요소의 일부 고정 크기 백업 저장소에 대한 차단 대기열 구현을 작성하려는 경우입니다.

wait() 및 notify()는 여러 스레드의 작업을 조정하는 Java의 보호 블록에서 사용됩니다. wait() 메서드는 스레드를 일시 중단하고 notify() 메서드를 사용하여 스레드를 깨우는 데 사용됩니다.

wait() 메소드

wait() 메서드는 다른 스레드가 완료될 때까지 현재 스레드를 강제로 기다리거나 동일한 개체에서 notify() 또는 notifyAll() 메서드를 호출합니다. wait() 메서드는 다음과 같은 다양한 방법으로 사용할 수 있습니다.

  1. wait() 사용:

    이것은 다른 스레드가 notify() 또는 notifyAll() 메소드를 호출할 때까지 현재 스레드를 무기한 기다리게 하는 wait() 메소드의 간단한 호출입니다.

  2. wait(long timeout) 사용:

    wait() 메서드를 호출하면 스레드가 자동으로 깨어난 후 시간 제한을 지정할 수 있습니다. 여기서 timeout은 긴 시간 값입니다.

    스레드는 notify() 및 notifyAll() 메서드를 사용하여 타임아웃 전에 깨울 수도 있습니다. timeout 매개변수에 값 0을 넣으면 wait() 호출과 유사하게 작동합니다.

  3. wait(long timeout, int nanos) 사용:

    이 호출은 wait(long timeout)과 유사하게 작동합니다. 유일한 차이점은 더 높은 정밀도를 제공할 수 있다는 것입니다.

    시간 초과 기간은 1_000_000*시간 초과 + 나노초로 나노초 단위로 계산됩니다.

notify() 및 notifyAll() 메서드

notify() 기능은 개체 모니터에 액세스하기 위해 대기 중인 스레드를 깨우는 데 사용됩니다. notify() 기능은 두 가지 방법으로 사용할 수 있습니다.

  1. notify() 사용:

    대기 중인 모든 스레드에 대해 notify() 메서드는 특정 스레드 하나만 깨우도록 알립니다. 깨울 스레드를 선택하는 것은 구현에 따라 결정적이지 않습니다.

    notify()는 하나의 스레드만 깨울 수 있기 때문에 여러 스레드를 깨우고 싶을 때 유용하지 않을 수 있습니다.

  2. notifyAll() 사용:

    notifyAll()은 객체 모니터의 모든 스레드를 깨울 것입니다. 스레드가 활성화되면 다른 스레드와 마찬가지로 일반적인 방식으로 완료됩니다.

wait() 메서드를 사용하여 스레드를 차단하고 notify() 메서드를 사용하여 깨우는 예제를 시도해 보겠습니다.

package delftstack;

import java.util.LinkedList;
import java.util.Queue;

public class Example<T> {
  private Queue<T> Demo_Queue = new LinkedList<T>();
  private int Q_Capacity;

  public Example(int Q_Capacity) {
    this.Q_Capacity = Q_Capacity;
  }

  public synchronized void put(T Demo_Element) throws InterruptedException {
    while (Demo_Queue.size() == Q_Capacity) {
      wait();
    }

    Demo_Queue.add(Demo_Element);
    // Wake up the thread. notifyAll() can also be used for multiple threads
    notify();
  }

  public synchronized T take() throws InterruptedException {
    while (Demo_Queue.isEmpty()) {
      // Ask the thread to wait
      wait();
    }

    T item = Demo_Queue.remove();
    // Wake up the thread. notifyAll() can also be used for multiple threads
    notify();
    return item;
  }
}

위의 코드는 wait() 및 notify() 호출이 코드의 동기화된 영역에 있는지 확인해야 하는 간단한 대기열 차단 작업을 보여줍니다.