개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.05.21 07:02

Threaded::notify에 대한 질문

목록
  • 클린코더 2일 전 2025.05.21 07:02
  • 5
    1
저는 Java의 스레드 관련된 문제를 해결하고자 합니다.
스레드 관련된 notify() 메소드는 어떤 역할을 하는 것일까요?
notify() 메소드는 어떤 스레드를 깨워서 실행할 수 있을까요?

또한, notifyAll() 메소드는 notify() 메소드와 어떤 차이가 있을까요?

아래의 코드를 보시면 스레드가 notify() 메소드를 호출했을 때 어떤 일이 일어나는지 알려주세요.


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();

        }

    }

}


    댓글목록

    profile_image
    나우호스팅  2일 전



    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

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 21,608건 / 29 페이지

검색

게시물 검색