我正在尝试在书面程序下运行。但是在这里我得到了异常(exception)

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at main.java.OddEven$even.run(OddEven.java:16)
at java.lang.Thread.run(Unknown Source)

我找不到异常背后的原因。

通知方法中正在执行。仅当当前线程不拥有锁对象时,才在notify方法中获得IllegalMonitorStateException。
public class OddEven {

private Integer count = 0;
Object ob = new Object();

class even implements Runnable {

    @Override
    public void run() {
            while (count % 2 == 0) {
                synchronized (ob) {
                if (count % 2 == 0) {
                    System.out.println(count++);
                    notify();
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
        }

    }
}

class odd implements Runnable {
    @Override
    public void run() {
            while (count % 2 != 0) {
                synchronized (ob) {
                if (count % 2 != 0) {
                    System.out.println(count++);
                    notify();
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
        }

    }

}

public static void main(String[] args) throws CloneNotSupportedException {
    OddEven t1 = new OddEven();
    Thread e = new Thread(t1.new even());
    Thread o = new Thread(t1.new odd());
    e.start();
    o.start();
}

}

最佳答案

要在某个对象上调用notify(),您需要对该对象进行锁定,即在该对象上处于同步的块中。您处于同步块(synchronized block)中,但是在ob上调用notify()时,您正在this上进行同步。

您还必须将ob用于notify()wait()调用,或者在this上进行同步。

关于java - 使用多线程运行奇数偶程序时获取异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39866502/

10-12 05:49