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

Sheeraz Gul 2023년10월12일
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() 호출이 코드의 동기화된 영역에 있는지 확인해야 하는 간단한 대기열 차단 작업을 보여줍니다.

작가: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

관련 문장 - Java Method