我正在处理一个任务,我有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();
}
}
答案 0 :(得分:0)
此方法只应由作为其所有者的线程调用 这个对象的监视器。线程成为对象的所有者 以三种方式之一监控:
- 执行该对象的同步实例方法。
- 执行在对象上同步的同步语句的主体。
- 对于Class类型的对象,通过执行该类的同步静态方法。
您必须同步正在呼叫通知的对象。
注意:由于wait()可能会错过通知或虚假唤醒,因此您应该将状态更改与通知/等待关联起来。即检查wait()上的状态更改并在notify()上引入状态更改