Java Object notifyAll() 方法

目录
文章目录隐藏
  1. 语法
  2. 参数
  3. 返回值
  4. 实例

Object notifyAll() 方法用于唤醒在该对象上等待的所有线程。

notifyAll() 方法跟 notify() 方法一样,区别在于 notifyAll() 方法唤醒在此对象监视器上等待的所有线程,notify() 方法是一个线程。

如果当前线程不是对象监视器的所有者,那么调用 notifyAll() 方法同样会发生 IllegalMonitorStateException 异常。

语法

public final void notifyAll()

参数

  •  。

返回值

没有返回值。

实例

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

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
 
public class MybjTest {
 
    private List synchedList;
 
    public MybjTest() {
        // 创建一个同步列表
        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 MybjTest demo = new MybjTest();
 
        Mybjable runA = new Mybjable() {
 
            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.");
                }
            }
        };
 
        Mybjable runB = new Mybjable() {
 
            // 执行添加元素操作,并开始循环
            public void run() {
                demo.addElement("Hello!");
            }
        };
 
        try {
            Thread threadA1 = new Thread(runA, "Baidu");
            threadA1.start();
 
            Thread.sleep(500);
 
            Thread threadA2 = new Thread(runA, "Mybj");
            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!

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » Java Object notifyAll() 方法

发表回复