[java] wait() 메소드와 notify() 메소드의 역할은?

자바에서 wait() 메소드와 notify() 메소드는 스레드 간의 동기화를 제어하는데 사용됩니다.

wait() 메소드는 스레드가 다른 스레드에 의해 특정 조건을 충족할 때까지 대기하도록 만듭니다. 이 메소드를 호출한 스레드는 일시적으로 대기 상태가 되며 다른 스레드가 notify() 메소드를 호출할 때까지 재개되지 않습니다.

notify() 메소드는 wait() 메소드에 의해 일시적으로 대기 상태에 있는 스레드 중 하나를 깨우는데 사용됩니다. notify() 메소드를 호출한 스레드는 wait() 메소드에 의해 대기 중인 스레드 중 하나를 선택하여 깨웁니다. 또한 notify() 메소드를 호출해도 현재 실행중인 스레드가 바로 중단되지 않고 이후에 해당 스레드를 통해 wait()에 의해 일시적으로 중단된 스레드가 재개됩니다.

이러한 wait() 메소드와 notify() 메소드는 스레드 간의 상호작용을 동기화하여 스레드 간의 경쟁 조건이나 데드락과 같은 문제를 해결하는 데 사용됩니다.

예시 코드:

// 자원을 공유하는 클래스
class SharedResource {
   public synchronized void printMessage(String message) {
      while (!message.equals("Hello")) {
         try {
            // 메시지가 "Hello"가 아닌 경우 대기
            wait();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
      // "Hello" 메시지인 경우 메시지 출력 후 notify() 호출
      System.out.println(message);
      notify();
   }

   public synchronized void setMessage(String message) {
      // 메시지 설정 후 notify() 호출
      System.out.println("Setting message: " + message);
      notify();
   }
}

public class Main {
   public static void main(String[] args) throws InterruptedException {
      // 공유 자원 인스턴스 생성
      SharedResource resource = new SharedResource();

      // 메시지 출력 스레드 생성
      Thread printThread = new Thread(() -> {
         resource.printMessage("Hi");
      });

      // 메시지 설정 스레드 생성
      Thread setThread = new Thread(() -> {
         try {
            Thread.sleep(2000); // 2초간 대기
            resource.setMessage("Hello");
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      });

      // 스레드 실행
      printThread.start();
      setThread.start();

      // 스레드 실행 종료 대기
      printThread.join();
      setThread.join();
   }
}

참고 자료: