Java中的Wait和Notify是實現線程間協作的兩個重要方法。當一個線程需要等待另一個線程完成一些操作,或者等待一些資源才能繼續執行時,就需要使用Wait和Notify。
Object.wait()
wait()方法使一個線程處于等待狀態,直到另一個線程調用該對象的notify()或notifyAll()方法喚醒它。wait()方法只能在同步方法或同步代碼塊中使用。
Object.notify() Object.notifyAll()
notify()和notifyAll()方法都是用來喚醒因調用wait()方法而處于等待狀態的線程。notify()方法會隨機喚醒一個等待線程,而notifyAll()方法會喚醒所有等待線程。notify()和notifyAll()方法也只能在同步方法或同步代碼塊中使用。
下面是一個使用wait()和notify()實現線程間通信的例子:
public class WaitNotifyExample { public static void main(String[] args) { final Object lock = new Object(); // 定義鎖對象 ThreadA threadA = new ThreadA(lock); // 創建線程A ThreadB threadB = new ThreadB(lock); // 創建線程B threadA.start(); // 啟動線程A threadB.start(); // 啟動線程B } } class ThreadA extends Thread { private final Object lock; public ThreadA(Object lock) { this.lock = lock; } public void run() { synchronized (lock) { System.out.println("ThreadA開始等待"); try { lock.wait(); // 等待ThreadB喚醒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ThreadA已被喚醒"); } } } class ThreadB extends Thread { private final Object lock; public ThreadB(Object lock) { this.lock = lock; } public void run() { synchronized (lock) { System.out.println("ThreadB開始喚醒"); lock.notify(); // 喚醒ThreadA System.out.println("ThreadB已喚醒一個線程"); } } }
在上面的代碼中,ThreadA線程在同步代碼塊中調用了wait()方法,進入等待狀態。ThreadB線程在同步代碼塊中調用了notify()方法,喚醒了處于等待狀態的ThreadA線程。