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:
Author And Source
이 문제에 관하여(4-4.(5) Thread Wait Notify), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@zhyun1220/4-4.5-Thread-Wait-Notify저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)