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 所有結束