Thread等待通知中的IllegalMonitorStateException

时间:2014-12-18 10:18:04

标签: java multithreading

我正在处理一个任务,我有n个线程,每个线程将按顺序[1到n]打印第n个数字。每个线程都在等待并相互通知。
例如: - 如果我们有6个螺纹,那么第一个螺纹应该打印第1,2个螺纹应该打印2,依此类推。[顺序1到6]
当我在程序下运行时,我得到IllegalMonitorStateException。

package interviews;
public class NumerPrintingwithThreadCount {
public static void main(String[] args) throws InterruptedException {
    int Max =6;
    Integer [] o = new Integer [Max];
    for (int i = 0; i < Max; i++) {
        o[i] = new Integer(i);
    }
    PrintingThread []tt = new PrintingThread [Max];

    for (int i = 0; i <Max; i++) {
        Integer obj1 =o[i];
        Integer obj2=null;
        if(i==Max-1){
        obj2 = o[0];
        }
        else{
        obj2=o[i+1];
        }
        PrintingThread t=new PrintingThread(obj1, obj2,0);
        tt[i]=t;
    }
    for (int i=tt.length-1; i >=0; i--) {
        tt[i].setName("Thread"+1);
        tt[i].start();
        Thread.sleep(1);
    }  
}
}  
class PrintingThread extends Thread{
    Integer object1=null;
    Integer object2=null;
    int min =0;
    public PrintingThread(Integer obj1 ,Integer obj2, int min) {
        this.object1=obj1;
        this.object2=obj2;
        this.min=min;
    }
    public void run() {
        try {
            if(min==object1.intValue())
            {
                object2.notify();
            }else{
                synchronized (object2) {
                    object2.wait();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName());
            object2.notify();
    }
}

1 个答案:

答案 0 :(得分:0)

来自Object.notify()

的Javadoc
  

此方法只应由作为其所有者的线程调用   这个对象的监视器。线程成为对象的所有者   以三种方式之一监控:

     
      
  • 执行该对象的同步实例方法。
  •   
  • 执行在对象上同步的同步语句的主体。
  •   
  • 对于Class类型的对象,通过执行该类的同步静态方法。
  •   

您必须同步正在呼叫通知的对象。

注意:由于wait()可能会错过通知或虚假唤醒,因此您应该将状态更改与通知/等待关联起来。即检查wait()上的状态更改并在notify()上引入状态更改