4-4.(5) Thread Wait Notify

wait() , notify()

  • 동기화 영역에서 사용해야 의미가 있음

  • wait()메서드
    : 동기화 영역에서 락을 풀고 Wait-Set영역(공유객체별 존재)으로 이동

  • notify() 또는 notifyAll() 메서드
    : Wait-Set영역에 있는 쓰레드를 깨워서 run()
    : notify()는 하나, notifyAll()은 전부를 깨운다

  • Object 클래스에서 제공하는 메서드

T19_WaitNotifyTest

public class T19_WaitNotifyTest {
	public static void main(String[] args) {
		
		//4.공유객체
		WorkObject workObj = new WorkObject();
		
		//5.쓰레드 호출
		Thread tha = new ThreadA(workObj);
		Thread thb = new ThreadB(workObj);
		
		//A작업 중 -> wait() -> 대기실 아무도 없음 -> WaitSet(Lock해제하고)
		//B작업 시작 -> notify() -> waitSet속에 A깨움 -> run()
		
		tha.start();
		thb.start();
	}
}

1. 공통으로 사용할 객체

: 메서드 2개
: 해당 쓰레드가 들어와서 메서드 실행 -> notify()호출 -> 깨움 ->
wait() -> Wait-Set 대기실

class WorkObject{
	public synchronized void methodA() {
		System.out.println("methodA()에서 작업 중...");
		
		notify();
		
		try {
			wait(); //lock을 풀고 wait-set영역으로 이동
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public synchronized void methodB() {
		System.out.println("methodB()에서 작업 중...");
		
		notify();
		
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

2. WorkObject의 methodA()메서드만 호출하는 쓰레드

: ThreadA를 10번 호출

class ThreadA extends Thread{
	private WorkObject workObj;

	public ThreadA(WorkObject workObj) {
		this.workObj = workObj;
	}
	
	@Override
	public void run() {
		for(int i=1; i<=10; i++) {
			workObj.methodA();
		}
		System.out.println("ThreadA 종료");
	}//run
}//class

3. WorkObject의 methodB()메서드만 호출하는 쓰레드

class ThreadB extends Thread{
	private WorkObject workObj;

	public ThreadB(WorkObject workObj) {
		this.workObj = workObj;
	}
	
	@Override
	public void run() {
		for(int i=1; i<=10; i++) {
			workObj.methodB();
		}
		System.out.println("ThreadB 종료");
	}//run
}//class
  • Console:

좋은 웹페이지 즐겨찾기