울음참고 개발공부
article thumbnail
728x90

 

 

sleep() 과 wait() 의 차이점

 

 

 

sleep()

 

  • Thread.sleep() 은 java.lang.Tread 클래스의 정적 메서드로, 현재 실행 중인 스레드를 일시적으로 지연시키는데 사용됨
  • sleep() 은 주로 프로그램의 특정 시간 동안 지연을 발생시키기 위해 사용됨
    • 예 ) 주어진 시간 동안 대기하고 일정 시간마다 작업을 수행하는 등의 기능을 구현할 때 유용함
  • 인터럽트가 발생하거나 지정된 시간이 경과하면 스레드가 실행을 재개함
  • 락을 해제하지않아 다른 스레드가 해당 스레드가 사용 주아니 공유 자원에 접근할 수 없음
try {
    // 5초 동안 현재 스레드를 일시 중지합니다.
    Thread.sleep(5000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

 

 

 

wait()

 

  • Object.wait() 메서드는 모든 객체의 인스턴스 메서드로, 스레드 간의 동기화를 위해 사용됨
  • wait() 은 특정 조건이 충족될 때까지 스레드를 일시 중지시키는데 사용됨
  • 대기 중인 스레드는 다른 스레드가 락을 해제하고 'notify()' 또는 'notifyAll()' 메서드를 호출하여 신호를 보낼때 까지 기다림
  • wait() 은 반드시 synchronized 블록 내에서 호출되어야함. 그렇지 않으면 'IllegalMonitorStateException' 이 발생
  • wait() 은 다른 스레드에게 락을 양보하고, 해당 객체의 락을 잃게됨

 

Object sharedResource = new Object();

// synchronized 블록 안에서 wait() 호출
synchronized (sharedResource) {
    try {
        // 조건이 충족될 때까지 현재 스레드를 일시 중지하고 락을 양보합니다.
        sharedResource.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

 

 


 

 

 

notify() 와 notifyAll() 의 차이점

 

 

공통점

Java 에서 스레드 간의 동기화를 위해 사용되는 메서드로, Object 클래스의 인스턴스 메서드임

 

 

 

notify() 

 

  • notity() 는 대기 중인 하나의 스레드를 깨운다
  • 호출한 객체가 락을 보유하고 있는 스레드 중 하나가 'wait()'로 인해 대기 중인 상태라면, 그 중하나의 스레드가 임의로 선택되어 실행을 재개한다. 
  • 선택되는 스레드는 보장 되지 않으며, 어떤 스레드가 깨어날지 정확히 예측할 수 없다
  • 만약 대기 중인 스레드가 없다면, notity() 호출은 아무 작업도 수행하지 않는다

 

 

 

notifyAll()

 

  • notifyAll() 은 대기 중인 모든 스레드를 깨운다
  • 호출한 객체의 락을 보유하고 있는 스레드 중 대기 중인 모든 스레드들이 실행을 재개한다.
  • notifyAll() 조건을 사용하면 모든 대기 중인 스레드가 깨어날 수 있으므로, 모든 스레드가 자신의 조건을 다시 확인하고 필요한 작업을 수행해야한다.

 

 

요약 
notify() 는 대기 중인 스레드 중 하나를 임의로 선택하여 깨우는 반면,
notifyAll() 은 모든 대기 중인 스레드를 깨웁니다. 상황에 따라 적절히 선택하여 스레드 간의 동기화를 구현하는 것이 중요합니다.

 

 

 


 

notify() 와 notifyAll() 은 주로 wait() 과 함께 사용된다

wait() 메서드는 특정 조건이 충족될 때까지 스레드를 대기 상태로 만든다

다른 스레드는 해당 조건을 만족시키고, 작업을 완료한 후에 notity() 또는 notifyAll() 을 호출하여 대기 중인 스레드에게 신호를 보내어 실행을 재개시킨다. 

 

 

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

        Thread thread1 = new Thread(() -> {
            synchronized (resource) {
                try {
                    resource.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (resource) {
                try {
                    resource.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread3 = new Thread(() -> {
            resource.work();
        });

        thread1.start();
        thread2.start();

        // Adding a delay to ensure threads 1 and 2 are in wait state before thread 3 starts.
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        thread3.start();
    }

    static class SharedResource {
        synchronized void work() {
            System.out.println("Working...");
            notifyAll();
        }
    }
}

 

 

 

 

728x90
profile

울음참고 개발공부

@메각이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!