Object.wait()与Object.notify()的用法详细解析

 更新时间:2013年09月06日 17:44:33   作者:  
以下是对java中Object.wait()与Object.notify()的用法进行了详细的分析介绍,需要的朋友可以过来参考下

wait、notify和notifyAll方法是Object类的final native方法。所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序中有以下三种形式调用wait等方法。

复制代码 代码如下:

wait();//方式1:
this.wait();//方式2:
super.wait();//方式3

void notifyAll()
解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void notify()
随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void wait()
导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void wait(long millis)和void wait(long millis,int nanos)
导致线程进入等待状态直到它被通知或者经过指定的时间。这些方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

Object.wait()和Object.notify()和Object.notifyall()必须写在synchronized方法内部或者synchronized块内部,这是因为:这几个方法要求当前正在运行object.wait()方法的线程拥有object的对象锁。即使你确实知道当前上下文线程确实拥有了对象锁,也不能将object.wait()这样的语句写在当前上下文中。如:

复制代码 代码如下:

package edu.sjtu.erplab.ObjectTest;

class A
{
    public synchronized void printThreadInfo() throws InterruptedException
    {
        Thread t=Thread.currentThread();
        System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
    }
}

 

public class ObjectWaitTest {
    public static void main(String args[])
    {
        A a=new A();
        //因为printThreadInfo()方法抛出InterruptedException异常,所以这里必须使用try-catch块
        try {
            a.printThreadInfo();
            a.wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}


程序运行会报错,运行结果如下:
ThreadID:1, ThreadName:main
Exception in thread "main" java.lang.IllegalMonitorStateException
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)

正确的写法应该是
复制代码 代码如下:

package edu.sjtu.erplab.ObjectTest;

class A
{
    public synchronized void printThreadInfo() throws InterruptedException
    {
        Thread t=Thread.currentThread();
        System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
//        this.wait();//一直等待
        this.wait(1000);//等待1000ms
//        super.wait(1000);
    }
}

 

public class ObjectWaitTest {
    public static void main(String args[])
    {
        A a=new A();
        //因为printThreadInfo()方法抛出InterruptedException异常,所以这里必须使用try-catch块
        try {
            a.printThreadInfo();
            //a.wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Thread t=Thread.currentThread();
        System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
    }
}

相关文章

  • mybatis generator 使用方法教程(生成带注释的实体类)

    mybatis generator 使用方法教程(生成带注释的实体类)

    下面小编就为大家带来一篇mybatis generator 使用方法教程(生成带注释的实体类)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Springboot自带定时任务实现动态配置Cron参数方式

    Springboot自带定时任务实现动态配置Cron参数方式

    这篇文章主要介绍了Springboot自带定时任务实现动态配置Cron参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • FeignClient如何共享Header及踩坑过程记录

    FeignClient如何共享Header及踩坑过程记录

    这篇文章主要介绍了FeignClient如何共享Header及踩坑过程记录,
    2022-03-03
  • Springboot上传文件时提示405问题及排坑过程

    Springboot上传文件时提示405问题及排坑过程

    这篇文章主要介绍了Springboot上传文件时提示405问题及排坑过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 详解Java中的锁Lock和synchronized

    详解Java中的锁Lock和synchronized

    锁是Java并发编程中最重要的同步机制,Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文将详细介绍Lock和synchronized
    2021-06-06
  • 一文带你了解RabbitMQ消息转换器

    一文带你了解RabbitMQ消息转换器

    这篇文章主要为大家详细介绍了RabbitMQ中消息转换器的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-04-04
  • Java不定参数使用及一些注意情况

    Java不定参数使用及一些注意情况

    不定参数是一种特殊的参数类型,它允许方法接受可变数量的参数,本文主要介绍了Java不定参数使用及一些注意情况,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • SpringBoot实现接口防刷的五种方案

    SpringBoot实现接口防刷的五种方案

    接口防刷是保障系统安全与稳定性的重要措施,恶意的高频请求不仅会消耗服务器资源,还可能导致数据异常,甚至系统瘫痪,本文将介绍在SpringBoot框架下实现接口防刷的5种技术方案,需要的朋友可以参考下
    2025-04-04
  • SpringCloud配置刷新原理解析

    SpringCloud配置刷新原理解析

    这篇文章主要介绍了SpringCloud之配置刷新的原理,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • 基于Java的MathML转图片的方法(示例代码)

    基于Java的MathML转图片的方法(示例代码)

    最近接到一个新需求mathML转图片怎么实现呢?刚开始还真是蒙圈了,不知道怎么实现,今天小编记录一种基于Java的MathML转图片的方法,感兴趣的朋友一起看看吧
    2021-06-06

最新评论