4-4.(5) Thread Wait Notify
wait() , notify()
同期領域で使用してこそ意味がある
wait()メソッド
:同期領域でロックを解除してWait-set領域(共有オブジェクト固有)に移動します.
notify()またはnotifyAll()メソッド
:Wait-set領域のThreadを起動して実行()
:notify()が1、notifyAll()がすべて起動
Objectクラスが提供する方法
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()->Wat-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のmethod A()メソッドのみを呼び出すスレッド
: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メソッドB()メソッドのみを呼び出すスレッド
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
Reference
この問題について(4-4.(5) Thread Wait Notify), 我々は、より多くの情報をここで見つけました https://velog.io/@zhyun1220/4-4.5-Thread-Wait-Notifyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol