@Cesar
2016-03-15T09:04:58.000000Z
字数 1763
阅读 1671
Java 学习wait()
synchronized (lockObjectA) {try {lockObjectA.wait();} catch (InterruptedException e) {e.printStackTrace();}}
此时,代码块中会释放对对象lockObjectA的锁定,同时使lockObjectA进行等待,直到有线程调用了它的notify()或notifyAll()方法,才继续将lockObjectA锁定,并继续执行下面程序。
即:调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。
notify()
synchronized (lockObjectA) {lockObjectA.notify();}
唤醒在等待该对象同步锁的线程(只唤醒一个),在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
即:调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
notifyAll()
将所有等待该对象的线程全部唤起。
package Test0315;/*** Created by Cesar on 2016/3/15.*/public class TestWait extends Thread {private static Object lockObjectA = new Object();private int key;public TestWait(int key) {this.key = key;}@Overridepublic void run() {if (key == 0) {synchronized (lockObjectA) {System.out.println(key + "开始等待");try {lockObjectA.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(key + "等待结束");System.out.println(key + "成功锁定A");try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(key + "释放A");} else if (key == 1) {synchronized (lockObjectA) {lockObjectA.notify();}System.out.println(key + "释放了A");} else {synchronized (lockObjectA){System.out.println(3+"锁定了A");}}}public static void main(String[] args) {TestWait wait = new TestWait(0);wait.setName("Test Wait");wait.start();System.out.println("主线程休眠开始");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("主线程休眠结束,唤醒开始");TestWait wait1 = new TestWait(1);wait1.start();TestWait wait2 = new TestWait(2);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}wait2.start();try {wait2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("全部结束");}}
主线程休眠开始0开始等待主线程休眠结束,唤醒开始1释放了A0等待结束0成功锁定A0释放A3锁定了A全部结束