
Java의 스레드 관련된 notify() 메소드는 객체-level의 동기화에 사용됩니다. notify() 메소드는 wait() 메소드가 호출된 객체에 대한 잠금을 해제하고, 대기 중인 스레드 중 하나를 깨워서 실행할 수 있습니다. notify() 메소드는 대기 중인 스레드 중 하나를 선택하여 깨우기 때문에, notifyAll() 메소드와 차이가 있습니다.
notify() 메소드는 synchronized 블록 내에서 호출되어야 하며, notify() 메소드가 호출된 객체에 대한 잠금을 해제합니다. notify() 메소드는 대기 중인 스레드 중 하나를 선택하여 깨우기 때문에, notify() 메소드가 호출된 객체에 대한 잠금을 해제하면 대기 중인 스레드 중 하나가 실행됩니다.
아래의 코드를 보시면 스레드가 notify() 메소드를 호출했을 때 어떤 일이 일어나는지 알려드립니다.
#hostingforum.kr
java
public class ThreadNotifyExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
synchronized (ThreadNotifyExample.class) {
try {
ThreadNotifyExample.class.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
thread.start();
Thread.sleep(1000);
synchronized (ThreadNotifyExample.class) {
ThreadNotifyExample.class.notify();
}
}
}
위의 코드에서, main 스레드는 1초간 대기합니다. 이期间, thread 스레드는 ThreadNotifyExample.class의 wait() 메소드를 호출하여 대기합니다. 1초가 지났을 때, main 스레드는 ThreadNotifyExample.class의 notify() 메소드를 호출하여 대기 중인 thread 스레드를 깨웁니다. 이로 인해 thread 스레드가 실행됩니다.
notifyAll() 메소드는 모든 대기 중인 스레드를 깨워서 실행할 수 있습니다. notifyAll() 메소드는 notify() 메소드와 달리, 모든 대기 중인 스레드를 깨워서 실행합니다. notifyAll() 메소드는 synchronized 블록 내에서 호출되어야 하며, notifyAll() 메소드가 호출된 객체에 대한 잠금을 해제합니다.
#hostingforum.kr
java
public class ThreadNotifyAllExample {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (ThreadNotifyAllExample.class) {
try {
ThreadNotifyAllExample.class.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (ThreadNotifyAllExample.class) {
try {
ThreadNotifyAllExample.class.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
thread1.start();
thread2.start();
Thread.sleep(1000);
synchronized (ThreadNotifyAllExample.class) {
ThreadNotifyAllExample.class.notifyAll();
}
}
}
위의 코드에서, 두 개의 스레드 thread1과 thread2가 대기합니다. 1초가 지났을 때, main 스레드는 ThreadNotifyAllExample.class의 notifyAll() 메소드를 호출하여 모든 대기 중인 스레드를 깨웁니다. 이로 인해 thread1과 thread2 스레드가 실행됩니다.
2025-05-21 07:03