当用一个对象调用wait的时候,会发生java.lang.IllegalMonitorStateException异常。
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
也就是当前的线程不是此对象监视器的所有者。也就是要在当前线程锁定对象,才能用锁定的对象此行这些方法,需要用到synchronized ,锁定什么对象就用什么对象来执行notify()
,notifyAll()
,wait()
, wait(long)
, wait(long, int)操作,否则就会报IllegalMonitorStateException异常。
详细解释:
具体实例:
class test implements Runnable{
Thread a=new Thread(this);
Thread b=new Thread(this);
Thread c=new Thread(this);
int []s={0,0,1};
test(){
a.setName("王明");
b.setName("张丽");
c.setName("王华");
}
public synchronized void seller(int given){
if(given==5){
try {
a.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("王明排队");
System.out.println("王明拿出了5元钱");
s[2]++;
System.out.println("王明买到票");
}
else if(given==10){
try {
b.sleep(500);
} catch (InterruptedException e1) {
}
System.out.println("张丽排队");
while(s[2]<1)
{
System.out.println("张丽拿出了10元钱");
System.out.println("张丽需要等候");
try {
wait();
} catch (InterruptedException e) {
}
}
s[1]++;
s[2]--;
System.out.println("张丽买到票");
}
else if(given==20){
System.out.println("王华排队");
while(s[1]<1||s[2]<1)
{
System.out.println("王华拿出了20元钱");
System.out.println("王华需要等候");
try {
synchronized(c) // 也可以将这4行代码改为wait();
{ //
c.wait(); //
} //
} catch (InterruptedException e) {
}
}
s[0]++;
s[1]--;
s[2]--;
System.out.println("王华买到票");
}
notifyAll();
}
public void run(){
if(Thread.currentThread()==a)
{
seller(5);
}
if(Thread.currentThread()==b)
{
seller(10);
}
if(Thread.currentThread()==c)
{
seller(20);
}
}
}
public class test_thread{
public static void main(String []args){
test t1=new test();
t1.a.start();
t1.b.start();
t1.c.start();
}
}