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() 메서드는 다음과 같은 다양한 방법으로 사용할 수 있습니다.
-
wait()사용:이것은 다른 스레드가
notify()또는notifyAll()메소드를 호출할 때까지 현재 스레드를 무기한 기다리게 하는wait()메소드의 간단한 호출입니다. -
wait(long timeout)사용:wait()메서드를 호출하면 스레드가 자동으로 깨어난 후 시간 제한을 지정할 수 있습니다. 여기서timeout은 긴 시간 값입니다.스레드는
notify()및notifyAll()메서드를 사용하여 타임아웃 전에 깨울 수도 있습니다. timeout 매개변수에 값 0을 넣으면wait()호출과 유사하게 작동합니다. -
wait(long timeout, int nanos)사용:이 호출은
wait(long timeout)과 유사하게 작동합니다. 유일한 차이점은 더 높은 정밀도를 제공할 수 있다는 것입니다.시간 초과 기간은
1_000_000*시간 초과 + 나노초로 나노초 단위로 계산됩니다.
notify() 및 notifyAll() 메서드
notify() 기능은 개체 모니터에 액세스하기 위해 대기 중인 스레드를 깨우는 데 사용됩니다. notify() 기능은 두 가지 방법으로 사용할 수 있습니다.
-
notify()사용:대기 중인 모든 스레드에 대해
notify()메서드는 특정 스레드 하나만 깨우도록 알립니다. 깨울 스레드를 선택하는 것은 구현에 따라 결정적이지 않습니다.notify()는 하나의 스레드만 깨울 수 있기 때문에 여러 스레드를 깨우고 싶을 때 유용하지 않을 수 있습니다. -
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() 호출이 코드의 동기화된 영역에 있는지 확인해야 하는 간단한 대기열 차단 작업을 보여줍니다.