跳到主要内容

Java Object notify() 方法


Object notify() 方法用于唤醒一个在此对象监视器上等待的线程。

如果所有的线程都在此对象上等待,那么只会选择一个线程,选择是任意性的,并在对实现做出决定时发生。

一个线程在对象监视器上等待可以调用 wait() 方法。

notify() 方法只能被作为此对象监视器的所有者的线程来调用。

一个线程要想成为对象监视器的所有者,可以使用以下 3 种方法:

  • 执行对象的同步实例方法
  • 使用 synchronized 内置锁
  • 对于 Class 类型的对象,执行同步静态方法

一次只能有一个线程拥有对象的监视器。

如果当前线程不是此对象监视器的所有者的话会抛出 IllegalMonitorStateException 异常。

语法

public final void notify()

参数

返回值

没有返回值。

实例

以下实例演示了 notify() 方法的使用:

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class LectcodeTest {
private List synchedList;

public LectcodeTest() {
// 创建一个同步列表
synchedList = Collections.synchronizedList(new LinkedList());
}
// 删除列表中的元素
public String removeElement() throws InterruptedException {
synchronized (synchedList) {
// 列表为空就等待
while (synchedList.isEmpty()) {
System.out.println("List is empty...");
synchedList.wait();
System.out.println("Waiting...");
}
String element = (String) synchedList.remove(0);

return element;
}
}
// 添加元素到列表
public void addElement(String element) {
System.out.println("Opening...");
synchronized (synchedList) {
// 添加一个元素,并通知元素已存在
synchedList.add(element);
System.out.println("New Element:'" + element + "'");

synchedList.notifyAll();
System.out.println("notifyAll called!");
}
System.out.println("Closing...");
}
public static void main(String[] args) {
final LectcodeTest demo = new LectcodeTest();

Runnable runA = new Runnable() {
public void run() {
try {
String item = demo.removeElement();
System.out.println("" + item);
} catch (InterruptedException ix) {
System.out.println("Interrupted Exception!");
} catch (Exception x) {
System.out.println("Exception thrown.");
}
}
};

Runnable runB = new Runnable() {
// 执行添加元素操作,并开始循环
public void run() {
demo.addElement("Hello!");
}
};

try {
Thread threadA1 = new Thread(runA, "Google");
threadA1.start();

Thread.sleep(500);

Thread threadA2 = new Thread(runA, "Lectcode");
threadA2.start();

Thread.sleep(500);

Thread threadB = new Thread(runB, "Taobao");
threadB.start();

Thread.sleep(1000);

threadA1.interrupt();
threadA2.interrupt();
} catch (InterruptedException x) {
}
}
}

以上程序执行结果为:

List is empty...

List is empty...

Opening...

New Element:'Hello!'

notifyAll called!

Closing...

Waiting...

Waiting...

List is empty...

Hello!

Interrupted Exception!