java线程理解问题

时间:2014-04-18 15:15:03

标签: java multithreading

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

以下是多线程的代码:

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

谢谢, 佳日

2 个答案:

答案 0 :(得分:0)

object.wait的来电必须在object上同步。

您已拨打runnable.wait,但已在main上同步。

尝试main.wait();

答案 1 :(得分:0)

wait是一个函数,要求调用线程将监视器保存在目标上。

在您的情况下,您正在呼叫this.wait(),但不要将监视器放在this上。

你需要

synchronized (this) {
   wait();
}

main.wait();