반응형
package multi_thread.thread_alternate;
public class WorkObject {
public synchronized void methodA() { // 동기화 메소드에서만 사용 가능 (synchronized)
System.out.println("ThreadA의 methodA() 작업 실행");
notify(); // wait() 상태 스레드를 실행 대기로 변경 (실행 가능한 상태)
try { wait(); } // 자기 자신 일시정지 상태로 변경
catch (InterruptedException e) { }
}
public synchronized void methodB() { // 동기화 메소드에서만 사용 가능 (synchronized)
System.out.println("ThreadB의 methodB() 작업 실행");
notify(); // wait() 상태 스레드를 실행 대기로 변경 (실행 가능한 상태)
try { wait(); } // 자기 자신 일시정지 상태로 변경
catch (InterruptedException e) { }
}
}
package multi_thread.thread_alternate;
public class ThreadA extends Thread{
private WorkObject workObject;
public ThreadA(WorkObject workObject) {
this.workObject = workObject;
}
@Override
public void run() {
for(int i = 0 ; i < 10; i++) {
workObject.methodA();
}
}
}
package multi_thread.thread_alternate;
public class ThreadB extends Thread{
private WorkObject workObject;
public ThreadB(WorkObject workObject) {
this.workObject = workObject;
}
@Override
public void run() {
for(int i = 0 ; i < 10; i++) {
workObject.methodB();
}
}
}
package multi_thread.thread_alternate;
public class WaitNotifyExample {
public static void main(String[] args) {
WorkObject sharedObject = new WorkObject();
ThreadA threadA = new ThreadA(sharedObject);
ThreadB threadB = new ThreadB(sharedObject);
threadA.start();
threadB.start();
}
}
두 개 스레드를 교대로 번갈아 실행 시키고 싶을 때 notify()와 wait()를 이용하면 됩니다.
자신의 작업을 시작하면 상대방 스레드(B)를 실행대기 상태를 걸고 자신(A)은 실행합니다.
그 후 자신의 작업이 끝나면(A) 또 상대방 스레드(B)가 상대방(A)을 실행대기로 만들고 자기(B)는 실행합니다.
실행 끝난 후 자신(B)을 일시정지 상태로 만들어야합니다.
공유객체는 각 작업 내용을 동기화 메소드로 구분해야합니다.
notify() 같은 공유 객체의 동기화 메소드를 이용하는 상대방 스레드 실행대기상태로 만듭니다.
wait() 자신은 일시 정지 상태로 만듭니다.
이렇게 번갈아가면서 실행 되게 됩니다.
반응형
'[Java] > [Java]' 카테고리의 다른 글
[Java] 자바 멀티스레드 [Multi-Thread] 데몬 스레드 (0) | 2021.08.06 |
---|---|
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 중지 (stop플래그, interrupt()) (0) | 2021.08.06 |
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 일시 중지 또는 중지 (join() (0) | 2021.08.05 |
[Java] 자바 멀티스레드 [Multi-Thread] 실행 대기 상태 만들기 (yield()) [실행 양보] (0) | 2021.08.04 |
[Java] 자바 멀티스레드 [Multi-Thread] 공유 객체 임계영역 설정 (synchronized) (0) | 2021.08.04 |