http://www.cnblogs.com/xwdreamer/archive/2012/05/12/2496843.htmlhtml
参考文献:java
object.wait()和object.notify()和object.notifyall()多线程
正文this
wait、notify和notifyAll方法是Object类的final native方法。因此这些方法不能被子类重写,Object类是全部类的超类,所以在程序中有如下三种形式调用wait等方法。线程
wait();//方式1:htm
this.wait();//方式2:对象
super.wait();//方式3blog
void notifyAll()开发
解除全部那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。若是当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。get
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()这样的语句写在当前上下文中。如:
View Code
程序运行会报错,运行结果以下:
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());
}
}
具体的能够参考多线程开发中提到的消费者与生产者案例的最后一个代码示例。