一、什麼是等待機制
等待機制指的是當一個線程需要等待某一條件滿足時,它會進入一種等待狀態,以便讓其他線程有機會運行。這種等待狀態是為了減少CPU資源的浪費,提高程序的效率。
在Java中,我們可以通過wait()、notify()和notifyAll()方法來實現等待機制。
二、wait()方法
wait()方法是Object類中的方法,它的作用是讓當前線程釋放鎖,然後進入等待狀態,直到其他線程使用notify()或notifyAll()方法喚醒它。
具體步驟如下:
1. 獲取相應的鎖; 2. 判斷條件是否滿足,如果不滿足,則調用wait()方法進入等待狀態,同時釋放鎖; 3. 條件滿足時,調用notify()或notifyAll()方法喚醒等待的其他線程; 4. 喚醒後,當前線程重新獲取鎖,繼續執行。
三、notify()和notifyAll()方法
notify()方法隨機喚醒一個正在等待的線程,而notifyAll()方法則會喚醒所有正在等待的線程。
一般情況下,我們使用notifyAll()方法要比notify()方法更可靠,因為notify()方法可能會出現死鎖的情況。
四、代碼示例
下面是一個簡單的示例,其中線程A等待線程B列印完畢後再執行:
public class WaitNotifyDemo { public static void main(String[] args) throws Exception { final Object lock = new Object(); Thread threadA = new Thread(() -> { synchronized (lock) { System.out.println("Thread A is waiting for lock."); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread A finished."); } }); Thread threadB = new Thread(() -> { synchronized (lock) { System.out.println("Thread B is running."); System.out.println("Thread B is finished."); lock.notify(); } }); threadA.start(); Thread.sleep(1000); threadB.start(); } }
執行結果如下:
Thread A is waiting for lock. Thread B is running. Thread B is finished. Thread A finished.
可以看到,線程A在等待線程B列印完畢後才執行,最終輸出了「Thread A finished.」。
五、總結
Java等待機制是Java多線程編程中一個非常重要的方面,它通過wait()、notify()和notifyAll()方法實現線程之間的協作,避免了資源的浪費和程序的效率問題。在使用等待機制時,要注意線程的同步和鎖的釋放,以免出現死鎖等問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/303263.html