虽然我的问题听起来很愚蠢…
这是多线程的代码:
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>
我不明白它为什么要抛出IllegalMonorStateException
。
这里我试图实现的是,如果X的值比40的值更粗糙,则相同的线程应该等待并让其他线程执行。
谢谢亚什
等待
是一个要求调用线程将监视器保持在目标上的函数。
在您的情况下,您正在调用this. awa()
,但不要将监视器放在this
上。
你需要要么
synchronized (this) {
wait();
}
或
main.wait();
object. awa
的调用必须在object
上同步。
您调用了runnable. awa
,但在main
上同步。
尝试main. awa();