wait() 與 notify/notifyAll() 是Object類的方法
1. wait() 與notify/notifyAll方法必須在同步代碼塊中使用
在執行以上方法時,要先獲得鎖。那么怎么獲得鎖呢?
使用synchronized關鍵字獲得鎖。因此,wait() 與 notify/notifyAll() 經常與synchronized搭配使用,
即在synchronized修飾的同步代碼塊或方法里面調用wait() 與 notify/notifyAll()方法。
2. wait() 與 notify/notifyAll() 的執行過程
前提:鎖只有一把,只是一個對象
當線程執行lock.wait()時,會把當前的鎖釋放,然后讓出CPU,進入等待狀態。
當執行notify/notifyAll方法時,會喚醒一個/所有處於等待該對象鎖的線程
package cn.bit13.libra.testWaitNotify; public class ThreadA extends Thread{ private Object lock; public ThreadA(Object lock){ super(); this.lock= lock; } @Override public void run(){ synchronized (lock){ try { System.out.println("A放棄鎖"); lock.wait(); }catch(InterruptedException e){ } System.out.println("A重獲鎖"); } } }
package cn.bit13.libra.testWaitNotify; public class ThreadB extends Thread{ private Object lock; public ThreadB(Object lock){ super(); this.lock= lock; } @Override public void run(){ synchronized (lock){ System.out.println("B通知A可以重獲鎖(但必須等B執行完)"); lock.notify(); System.out.println("B運行完"); } } }
package cn.bit13.libra.testWaitNotify; public class TestWaitNotify { public static void main(String[] args){ Object lock= new Object(); //鎖即一個對象 Thread a= new ThreadA(lock); a.start(); Thread b= new ThreadB(lock); b.start(); } }
輸出:
A放棄鎖
B通知A可以重獲鎖(但必須等B執行完)
B運行完
A重獲鎖
3. notify()通知第一個wait的進程,notifyAll()通知所有wait的進程
