동기화 영역에서 사용해야 의미가 있음
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();
}
}
: 메서드 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();
}
}
}
: 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
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