쓰레드와 상태제어(wait, notify)

de_sj_awa·2021년 5월 10일

쓰레드와 상태제어(wait, notify)

wait과 notify는 동기화된 블록 안에서 사용해야 한다. wait를 만나게 되면 해당 쓰레드는 해당 객체의 모니터링 락에 대한 권한을 가지고 있다면 모니터링 락의 권한을 놓고 대기한다.

  • Thread를 상속받는 ThreadB 클래스를 작성
public class ThreadB  extends Thread{
    // 해당 쓰레드가 실행되면 자기 자신의 모니터링 락을 획득
    // 5번 반복하면 0.5초씩 쉬면서 total에 값을 누적
    // 그 후에 notify() 메소드를 호출하여 wait하고 있는 메소드를 깨움
    int total;
    @Override
    public void run(){
        synchronized (this){
            for(int i = 0; i < 5; i++){
                System.out.println(i + "를 더합니다.");
                total += i;
                try{
                    Thread.sleep(500);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
            notify();
        }
    }
}
  • 이번에는 ThreadB를 사용하여 wait하는 클래스 작성
 public class ThreadA {
        public static void main(String[] args){
            // 앞에서 만든 쓰레드 B를 만든 후 start 
            // 해당 쓰레드가 실행되면, 해당 쓰레드는 run메소드 안에서 자신의 모니터링 락을 획득
            ThreadB b = new ThreadB();
            b.start();

            // b에 대하여 동기화 블럭을 설정
            // 만약 main쓰레드가 아래의 블록을 위의 Thread보다 먼저 실행되었다면 wait를 하게 되면서 모니터링 락을 놓고 대기       
            synchronized(b){
                try{
                    // b.wait()메소드를 호출.
                    // 메인쓰레드는 정지
                    // ThreadB가 5번 값을 더한 후 notify를 호출하게 되면 wait에서 깨어남
                    System.out.println("b가 완료될때까지 기다립니다.");
                    b.wait();
                }catch(InterruptedException e){
                    e.printStackTrace();
                }

                //깨어난 후 결과를 출력
                System.out.println("Total is: " + b.total);
            }
        }
    }
  • 실행결과
b가 완료할때까지 기다립니다.
0를 더합니다.
1를 더합니다.
2를 더합니다.
3를 더합니다.
4를 더합니다.
Total is : 10

참고

profile
이것저것 관심많은 개발자.

0개의 댓글