Java Object wait() 方法

星河私藏家

Java Object wait() 方法


Object wait() 方法让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

当前线程必须是此对象的监视器所有者,否则还是会发生 IllegalMonitorStateException 异常。

如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException 异常。

语法

public final void wait()

参数

返回值

没有返回值。

实例

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

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
 
public class RunoobTest extends Object {
 
    private List synchedList;
 
    public RunoobTest() {
        // 创建一个同步列表
        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 RunoobTest demo = new RunoobTest();
 
        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, "Runoob");
            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!

版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com

目录[+]

取消
微信二维码
微信二维码
支付宝二维码