虽然我的问题听起来很愚蠢......
以下是多线程的代码:
public class Main {
private int x = -1;
public Main(int xy) {
this.setX(xy);
}
static Main main;
public static void main(String[] args) {
main = new Main(10);
Runnable runnable = new Runnable() {
@Override
public void run() {
synchronized (main) {
System.out.println(Thread.currentThread().getName());
for (int i = 0; i < 5; i++) {
main.setX(main.getX() + 10);
if (main.getX() >= 40) {
try {
wait();
} catch (InterruptedException e) {
}
}
System.out.println("X : " + main.getX());
}
}
}
};
Thread one = new Thread(runnable);
one.setName("Hi From One!!");
one.start();
Thread two = new Thread(runnable);
two.setName("Hi From Two!!");
two.start();
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
执行此代码时,我得到以下输出:
Hi From Two!!<br>
X : 20<br>
X : 30<br>
Exception in thread "Hi From Two!!" java.lang.IllegalMonitorStateException<br>
at java.lang.Object.wait(Native Method)<br>
at java.lang.Object.wait(Object.java:503)<br>
at Main$1.run(Main.java:23)<br>
at java.lang.Thread.run(Thread.java:722)<br>
Hi From One!!<br>
Exception in thread "Hi From One!!" java.lang.IllegalMonitorStateException<br>
at java.lang.Object.wait(Native Method)<br>
at java.lang.Object.wait(Object.java:503)<br>
at Main$1.run(Main.java:23)<br>
at java.lang.Thread.run(Thread.java:722)<br>
我不明白为什么它会抛出IllegalMonitorStateException
。
我想要实现的目标是,如果X的值大于40,则相同的线程应该等待并让其他人执行。
谢谢, 佳日
答案 0 :(得分:0)
object.wait
的来电必须在object
上同步。
您已拨打runnable.wait
,但已在main
上同步。
尝试main.wait();
答案 1 :(得分:0)
wait
是一个函数,要求调用线程将监视器保存在目标上。
在您的情况下,您正在呼叫this.wait()
,但不要将监视器放在this
上。
你需要
synchronized (this) {
wait();
}
或
main.wait();