我正在尝试学习多线程和练习,我正在尝试打印奇数和&使用两个线程的偶数。我创建了一个对象,它将充当两个线程的锁。当我尝试执行它时会抛出java.lang.IllegalMonitorStateException
。
class EVENODDimpl implements Runnable {
int num;
int temp = 0;
Object lock = new Object();
public EVENODDimpl( int num) {
this.num = num;
}
public void run() {
try {
synchronized (lock) {
while(temp<num) {
temp++;
System.out.println(Thread.currentThread().getName()+" "+temp);
this.notify();
this.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
主要方法:
public class EVENODD {
public static void main(String[] args) {
int i = 10;
EVENODDimpl ei = new EVENODDimpl(i);
Thread t1 = new Thread( ei,"EvenThread");
Thread t2 = new Thread( ei,"OddThread");
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
正如javadoc
所说抛出此异常表示某个线程试图在对象的监视器上等待,或者在没有指定监视器的情况下通知在对象监视器上等待的其他线程。
这意味着您的方法notify
和wait
应该拥有监视器。或者换句话说,调用这些方法的对象必须同步。您的this
对象未同步。这就是你得到这个例外的原因。在您的案例中,从lock
对象调用此方法。
你的逻辑仍然是错误的,但你需要探索它。
答案 1 :(得分:3)
wait
上的notify
和this
,但wait
notify
和lock
因lock
同步},你不能在其他对象上wait
和notify
,而不是正在同步的对象,工作版本:
class EVENODDimpl implements Runnable {
int num;
int temp = 0;
Object lock = new Object();
public EVENODDimpl( int num) {
this.num = num;
}
public void run() {
try {
synchronized (lock) {
while(temp<num) {
temp++;
System.out.println(Thread.currentThread().getName()+" "+temp);
lock.notify();
lock.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:1)
java.lang.IllegalMonitorStateException
异常发生是因为您在对象this.notify()
上使用了notify方法,但该Object未同步。
将synchronized (lock)
替换为:synchronized (this)