synchronized (lockObjectA) { try { lockObjectA.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }
此时,代码块中会释放对对象lockObjectA的锁定,同时使lockObjectA进行等待,直到有线程调用了它的notify()或notifyAll()方法,才继续将lockObjectA锁定,并继续执行下面程序。
即:调用任意对象的 wait() 方法致使该线程阻塞,该线程不可继续执行,而且该对象上的锁被释放。ide
synchronized (lockObjectA) { lockObjectA.notify(); }
唤醒在等待该对象同步锁的线程(只唤醒一个),在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM肯定唤醒哪一个线程,并且不是按优先级。
即:调用任意对象的notify()方法则致使因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到得到锁后才真正可执行)。this
将全部等待该对象的线程所有唤起。线程
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; } @Override public 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释放了A 0等待结束 0成功锁定A 0释放A 3锁定了A 所有结束