4-4.(5) Thread Wait Notify


wait() , notify()


  • 同期領域で使用してこそ意味がある

  • wait()メソッド
    :同期領域でロックを解除してWait-set領域(共有オブジェクト固有)に移動します.

  • notify()またはnotifyAll()メソッド
    :Wait-set領域のThreadを起動して実行()
    :notify()が1、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()->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
  • Console: