notify notifyAll wait

 * notify notifyAll wait 使用 

 * 1 一个对象执行相应的方法

 *  (一个对象wait后,需要调用同一个对象的notify唤醒这个对象的wait,可以在不同线程执行)

 * 2 个人理解方法执行必须在synchronize代码块中执行(因为方法执行的时候必须获得对象监视器,个人理解监视器就是锁)

 * 3 执行wait后当前线程会释放掉这个对象的锁,则其他线程就会获得这个对象锁(其他线程就能执行synchronize代码块中代码)

 * 

 * 场景设想: 一个运输公司要运输一批货物

 *         领导告诉所有的搬运工时刻准备着,(主线程创建N个线程待用,所有线程处于等待转改)

 *         一旦运输货物到了, (资源转备好后)

 *         马上开始执行搬运工作 (主线程调用notifyAll,唤醒所有子线程开始执行 )

public class TestNotify implements Runnable{

	private  Integer counter=0; 
	private String waitObj ; 
	
	public TestNotify(String wait,int counter2 ) {
		this.waitObj=wait ; 
		this.counter = counter2 ; 
	}

	public static void main(String[] args) {
		String wait1 = "" ; 
		
		for(int i=0;i<3;i++){
			TestNotify d = new TestNotify(wait1,i);
			new Thread(d).start(); 
		}
		
		try {
			Thread.sleep(10000);
			System.out.println( " 主线程结束 ");
			synchronized (wait1) {
				wait1.notifyAll();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		 synchronized (waitObj) {
			try {
				System.out.println("子线程启动=="+counter);
				Thread.sleep(2000);
				waitObj.wait();
				
				System.out.println("子线程结束"+counter);
			} catch ( Exception e) {
				e.printStackTrace();
			}
		}
	}
	
}

结果分析:子线程 0,1,2都计入wait后主线程调用notifyAll,则子线程开始执行wait后面代码;

子线程启动==0
子线程启动==2
子线程启动==1
 主线程结束 
子线程结束1
子线程结束2
子线程结束0

猜你喜欢

转载自username2.iteye.com/blog/2237947