[java] 자바에서 wait()와 notify()를 사용하는 방법은?

자바에서 wait()와 notify()는 멀티스레드 환경에서 스레드 간의 통신을 가능하게 해주는 메서드입니다.

wait() 메서드는 스레드가 다른 스레드에 의해 특정 조건이 충족될 때까지 대기하도록 합니다. 즉, wait()을 호출한 스레드는 락을 반납하고 대기 상태로 진입합니다. 반면, notify() 메서드는 대기 중인 스레드 중 하나를 깨워 실행 가능한 상태로 만들어줍니다.

다음은 wait()와 notify()를 사용하는 예제 코드입니다.

class SharedResource {
    private boolean isDataReady = false;

    public synchronized void produce() {
        // 데이터를 생성하는 로직
        isDataReady = true;
        notify(); // 대기 중인 스레드를 깨움
    }

    public synchronized void consume() throws InterruptedException {
        while (!isDataReady) {
            wait(); // 데이터가 준비될 때까지 대기
        }
        // 데이터를 소비하는 로직
        isDataReady = false; // 다음 소비를 위해 상태 초기화
    }
}

class Producer implements Runnable {
    private SharedResource resource;

    public Producer(SharedResource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        // 데이터 생성 로직 수행
        resource.produce();
    }
}

class Consumer implements Runnable {
    private SharedResource resource;

    public Consumer(SharedResource resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        try {
            // 데이터 소비 로직 수행
            resource.consume();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        SharedResource resource = new SharedResource();

        // 스레드 생성 및 시작
        Thread producerThread = new Thread(new Producer(resource));
        Thread consumerThread = new Thread(new Consumer(resource));
        producerThread.start();
        consumerThread.start();
    }
}

위 코드에서 Producer는 데이터를 생성하고, Consumer는 데이터를 소비하는 역할을 합니다. SharedResource 클래스는 데이터가 준비되었는지 여부를 관리하며, produce() 메서드에서는 데이터를 생성하고 isDataReady를 true로 설정한 후 대기 중인 소비자 스레드를 notify()로 깨웁니다.

consume() 메서드에서는 데이터가 준비될 때까지 while 루프를 돌면서 대기하며, 데이터가 준비되면 루프를 빠져나가 데이터를 소비한 후 isDataReady를 false로 초기화합니다.

이렇게 wait()와 notify()를 사용하면 스레드 간에 데이터의 동기화와 통신이 가능해지므로, 멀티스레드 환경에서 안전하게 작업을 수행할 수 있습니다.

[참고 자료]