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

de_sj_awa·2021년 5월 10일
0

쓰레드와 상태제어(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개의 댓글