Object.wait和notify方法

object‘s monitor

先来了解一下Object.wait和notify方法

?wait、notify和notifyAll方法是Object类的final native方法,所以这些方法不能被子类重写。?

Object类是所有类的超类,因此在程序中有以下三种形式调用wait等方法:

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

void notifyAll()

* Wakes up all threads that are waiting on this object‘s monitor. A thread waits on an object‘s monitor by calling one of the

* {@code wait} methods.

该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void notify()

     * Wakes up a single thread that is waiting on this object‘s

     * monitor. If any threads are waiting on this object, one of them

     * is chosen to be awakened. The choice is arbitrary and occurs at

* the discretion of the implementation. A thread waits on an object‘s

* monitor by calling one of the {@code wait} methods.

该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

void wait()

     * Causes the current thread to wait until another thread invokes the

     * {@link java.lang.Object#notify()} method or the

     * {@link java.lang.Object#notifyAll()} method for this object.

     * The current thread must own this object‘s monitor. 

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

下面是一个wait的示例

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}

void wait(long millis)和void wait(long millis,int nanos)

     * Causes the current thread to wait until another thread invokes the

     * {@link java.lang.Object#notify()} method or the

     * {@link java.lang.Object#notifyAll()} method for this object, or

     * some other thread interrupts the current thread, or a certain

     * amount of real time has elapsed(消逝,过去).

这些方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

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

下面这段代码的写法是错误的。。

package sync;

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();
        }
    }
}

应该要这么写:

package sync;

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());
    }
}

以上就是关于wait和notify方法的用法,具体请参见:http://www.cnblogs.com/xwdreamer/archive/2012/05/12/2496843.html

后记:Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。

=========================END=========================

时间: 2024-09-28 18:34:35

Object.wait和notify方法的相关文章

java.lang.Object 的 wait 和 notify方法,及关键字 synchronized的作用

1. synchronized的作用 synchronized类似于win32中的临界区,临界区的作用:对于共享的全局变量,在多个线程并发的情况下,对这样的全局变量的读写就会发生读写的冲突, 使得全局变量的读写,能够以原子的方式被执行,而不是一个线程要读取全局数据时候,由于线程调度,而另一个线程则此时被唤醒,改变了这个全局变量的值, 这样使得读取的线程获得的数据不稳定,所以对于全局变量的读写的代码,我们要使用临界区使得这些代码原子化,此时只要在临界区中的代码,就会以原子方式执行, 而不会由于线程

Java中Object类的公有方法

HashCode();wait();notify();equals();getClass();toString();clone();finalize(); 这里只是简单介绍一下其中的几个函数: HashCode(): * As much as is reasonably practical, the hashCode method defined by * class {@code Object} does return distinct integers for distinct * obje

Java中wait()和notify()方法的使用

1. wait方法和notify方法 这两个方法,包括notifyAll方法,都是Object类中的方法.在Java API中,wait方法的定义如下: public final void wait() throws InterruptedException Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this ob

Object有哪些公用方法?(转)

Object是所有类的父类,任何类都默认继承Object.Object类到底实现了哪些方法? 1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常. 2.getClass方法 final方法,获得运行时类型. 3.toString方法 该方法用得比较多,一般子类都有覆盖. 4.finalize方法 该方法用于释放资源.因为无法确定该方法什么时候被调用,很少使用. 5.equals方法 该

线程间通信的实现 wait()和notify()方法

Java提供了3个非常重要的方法来巧妙地解决线程间的通信问题.这3个方法分别是:wait().notify()和notifyAll().它们都是Object类的最终方法,因此每一个类都默认拥有它们. 虽然所有的类都默认拥有这3个方法,但是只有在synchronized关键字作用的范围内,并且是同一个同步问题中搭配使用这3个方法时才有实际的意义. 如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态. 如果对象调用了notify方法就会通知某个正在等待这个对象的

Object有哪些公用方法?

protected Object clone() 创建并返回此对象的一个副本.public boolean equals(Object obj) 指示其他某个对象是否与此对象"相等".protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法.public final Class<?> getClass() 返回此 Object 的运行时类.public int hashCode() 返回该对象的哈希码值.p

java多线程详解(6)-线程间的通信wait及notify方法

Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New):线程对象已经产生,但尚未被启动,所以无法执行.如通过new产生了一个线程对象后没对它调用start()函数之前.(2). 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它. 当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它

Java 多线程(七) 线程间的通信——wait及notify方法

线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html 因为wait和notify方法定义在Object类中,因此会被所有的类所继承. 这些方法都是final的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为. wait()方法 wait()方法使得当前线程必须要等

[ 转载 ] Java基础10--关于Object类下所有方法的简单解析

关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直接来看jdk的源码,开始我们的分析之路 1.hashcode() public native int hashCode();//native说明跟机器有关,跟对象的地址有关 如果我们新建一个类,而hashcode没有被重写的话,那么hashcode返回的值只于对象的地址有关,如果hashcode被重