提问者:小点点

java线程理解问题[重复]


虽然我的问题听起来很愚蠢…

这是多线程的代码:

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的值更粗糙,则相同的线程应该等待并让其他线程执行。

谢谢亚什


共2个答案

匿名用户

等待是一个要求调用线程将监视器保持在目标上的函数。

在您的情况下,您正在调用this. awa(),但不要将监视器放在this上。

你需要要么

synchronized (this) {
   wait();
}

main.wait();

匿名用户

object. awa的调用必须在object上同步。

您调用了runnable. awa,但在main上同步。

尝试main. awa();