Java Object wait(long timeout) 方法

Object wait(long timeout) 方法让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数 timeout 设置的超时时间。

如果 timeout 参数为 0,则不会超时,会一直进行等待,类似于 wait() 方法

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

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

如果传递的参数不合法,则会抛出 IllegalArgumentException 异常。

语法

public final void wait(long timeout)

参数

  • timeout – 等待时间(以毫秒为单位)。

返回值

没有返回值。

实例

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

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
 
public class MybjTest extends Object {
 
    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(10000); // 设置等待时间
                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!
1. 本站所有免费资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!
2. 本站不保证所提供下载的免费资源的准确性、安全性和完整性,免费资源仅供下载学习之用!如有链接无法下载、失效,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或技术教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
5. 加入前端开发QQ群:565733884,我们大家一起来交流技术!
码云笔记 » Java Object wait(long timeout) 方法

发表评论

提供最优质的资源集合

立即查看 了解详情