Java中notifyAll()方法如何使用

小億
123
2023-08-03 15:16:26

在Java中,可以使用notifyAll()方法來(lái)喚醒在等待某個(gè)對(duì)象的監(jiān)視器上的所有線程。notifyAll()方法是在Object類中定義的,所以可以在任何對(duì)象上調(diào)用該方法。

以下是notifyAll()方法的使用方式:

  1. 調(diào)用notifyAll()方法的對(duì)象必須是被同步的對(duì)象。這意味著在調(diào)用notifyAll()方法之前,必須先獲取對(duì)象的監(jiān)視器鎖??梢允褂胹ynchronized關(guān)鍵字來(lái)實(shí)現(xiàn)對(duì)象同步。

  2. 在調(diào)用notifyAll()方法之前,可能需要進(jìn)行一些邏輯判斷,以確定是否需要喚醒等待的線程。

  3. 調(diào)用notifyAll()方法后,所有正在等待該對(duì)象的監(jiān)視器的線程都會(huì)被喚醒,并開始競(jìng)爭(zhēng)該對(duì)象的監(jiān)視器鎖。

下面是一個(gè)簡(jiǎn)單的示例,演示了如何使用notifyAll()方法:

public class Example {
private final Object lock = new Object();
public void waitForNotification() {
synchronized (lock) {
try {
// 等待通知
lock.wait();
} catch (InterruptedException e) {
// 處理中斷異常
e.printStackTrace();
}
}
}
public void sendNotification() {
synchronized (lock) {
// 發(fā)送通知
lock.notifyAll();
}
}
}

在上面的示例中,waitForNotification()方法在獲取lock對(duì)象的監(jiān)視器鎖后,調(diào)用了lock.wait()來(lái)等待通知。sendNotification()方法在獲取lock對(duì)象的監(jiān)視器鎖后,調(diào)用了lock.notifyAll()來(lái)發(fā)送通知。

請(qǐng)注意,notifyAll()方法只會(huì)喚醒正在等待同一對(duì)象監(jiān)視器的線程,而不是喚醒所有線程。如果有多個(gè)對(duì)象需要喚醒,那么需要在每個(gè)對(duì)象上分別調(diào)用notifyAll()方法。

0