notifyAll()
方法在多線(xiàn)程編程中的作用是喚醒所有正在等待某個(gè)對(duì)象鎖的線(xiàn)程。當(dāng)一個(gè)線(xiàn)程調(diào)用了某個(gè)對(duì)象的 wait()
方法時(shí),該線(xiàn)程會(huì)釋放該對(duì)象的鎖并進(jìn)入等待狀態(tài)。當(dāng)另一個(gè)線(xiàn)程調(diào)用了相同對(duì)象的 notifyAll()
方法時(shí),所有處于等待狀態(tài)的線(xiàn)程將被喚醒并重新嘗試獲取對(duì)象鎖。
需要注意的是,notifyAll()
方法只能在同步代碼塊或同步方法中使用,因?yàn)樗枰谡{(diào)用時(shí)持有對(duì)象的鎖。此外,notifyAll()
方法并不能保證喚醒的線(xiàn)程立即執(zhí)行,因?yàn)樗鼈冃枰匦芦@取對(duì)象鎖,而這個(gè)鎖可能正在被其他線(xiàn)程持有。
notifyAll()
方法通常用于以下場(chǎng)景:
示例代碼:
public class NotifyAllExample {
private final Object lock = new Object();
public void producer() {
synchronized (lock) {
System.out.println("Producing data...");
// 假設(shè)生產(chǎn)數(shù)據(jù)的過(guò)程需要一些時(shí)間
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Data produced, notifying all waiting threads.");
lock.notifyAll();
}
}
public void consumer() {
synchronized (lock) {
while (true) {
try {
System.out.println("Waiting for data...");
lock.wait();
System.out.println("Data received, processing...");
// 假設(shè)處理數(shù)據(jù)的過(guò)程需要一些時(shí)間
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
在這個(gè)示例中,producer()
方法生產(chǎn)數(shù)據(jù),然后調(diào)用 lock.notifyAll()
喚醒所有等待的消費(fèi)者線(xiàn)程。consumer()
方法中的線(xiàn)程在沒(méi)有數(shù)據(jù)可用時(shí)調(diào)用 lock.wait()
進(jìn)入等待狀態(tài)。當(dāng)生產(chǎn)者線(xiàn)程喚醒它們時(shí),它們將開(kāi)始處理數(shù)據(jù)。