7월 9일 -Object클래스의 wait, notify, notifyAll

Yullgiii·2024년 7월 9일
0
post-thumbnail

Java의 Object 클래스의 wait, notify, notifyAll 메서드

Java에서 모든 클래스의 최상위 클래스는 Object 클래스이다. 이 클래스는 모든 객체가 기본적으로 사용할 수 있는 여러 메서드를 제공한다. 그중에서도 스레드 동기화를 위해 사용되는 중요한 메서드로 wait(), notify(), notifyAll()이 있다.

Object 클래스의 주요 메서드

  • toString(): 객체의 문자열 표현을 반환한다.
  • hashCode(): 객체의 해시 코드를 반환한다.
  • wait(): 호출한 스레드가 갖고 있던 고유 락을 해제하고, 스레드를 잠들게 한다.
  • notify(): 잠들어 있던 스레드 중 임의의 하나를 깨운다.
  • notifyAll(): 잠들어 있던 모든 스레드를 깨운다.

wait(), notify(), notifyAll() 메서드 사용법

wait(), notify(), notifyAll() 메서드는 반드시 고유 락을 가지고 있는 상태에서 호출되어야 한다. 즉, 이 메서드들은 반드시 synchronized 블록 내에서 실행되어야 한다. 그렇지 않으면 IllegalMonitorStateException이 발생한다.

예제 코드

다음은 wait(), notify(), notifyAll() 메서드를 사용하여 스레드 간의 통신을 구현한 예제이다.

class SharedResource {
    private boolean available = false;

    public synchronized void produce() throws InterruptedException {
        while (available) {
            wait();
        }
        System.out.println("Producing resource");
        available = true;
        notifyAll();
    }

    public synchronized void consume() throws InterruptedException {
        while (!available) {
            wait();
        }
        System.out.println("Consuming resource");
        available = false;
        notifyAll();
    }
}

class Producer extends Thread {
    private SharedResource resource;

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

    @Override
    public void run() {
        try {
            while (true) {
                resource.produce();
                Thread.sleep(500); // 생산 속도를 조절하기 위한 대기 시간
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Consumer extends Thread {
    private SharedResource resource;

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

    @Override
    public void run() {
        try {
            while (true) {
                resource.consume();
                Thread.sleep(500); // 소비 속도를 조절하기 위한 대기 시간
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

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

        producer.start();
        consumer.start();
    }
}

코드 설명

1. SharedResource 클래스:

  • produce() 메서드: 자원을 생성하는 메서드로, 자원이 이미 존재하면 대기(wait())하고, 자원이 없으면 자원을 생성하고 대기 중인 소비자를 깨운다(notifyAll()).
  • consume() 메서드: 자원을 소비하는 메서드로, 자원이 없으면 대기(wait())하고, 자원이 있으면 자원을 소비하고 대기 중인 생산자를 깨운다(notifyAll()).

2. Producer 클래스:

  • SharedResource 객체를 받아서 자원을 생성하는 스레드이다.

3. Consumer 클래스:

  • SharedResource 객체를 받아서 자원을 소비하는 스레드이다.

4. Main 클래스:

  • SharedResource 객체를 생성하고, 생산자와 소비자 스레드를 시작한다.

So...

wait(), notify(), notifyAll() 메서드는 Java에서 스레드 간의 동기화를 위해 매우 유용하게 사용된다. 이 메서드들은 반드시 synchronized 블록 내에서 호출되어야 하며, 이를 통해 스레드 간의 통신을 구현할 수 있다. 이 메서드들을 잘 활용하면 스레드 간의 자원 공유 문제를 효율적으로 해결할 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글