打印奇数&偶数使用多线程

时间:2017-08-28 09:48:38

标签: java multithreading

我正在尝试学习多线程和练习,我正在尝试打印奇数和&使用两个线程的偶数。我创建了一个对象,它将充当两个线程的锁。当我尝试执行它时会抛出java.lang.IllegalMonitorStateException

class EVENODDimpl implements Runnable {
    int num;
    int temp = 0;
    Object lock = new Object();

    public EVENODDimpl( int num) {
        this.num = num;
    }

    public void run() {
        try {
            synchronized (lock) {
                while(temp<num) {
                    temp++;
                    System.out.println(Thread.currentThread().getName()+"   "+temp);
                    this.notify();
                    this.wait();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } 
    }
}

主要方法:

public class EVENODD {
    public static void main(String[] args) {
        int i = 10;
        EVENODDimpl ei = new EVENODDimpl(i);
        Thread t1 = new Thread( ei,"EvenThread");
        Thread t2 = new Thread( ei,"OddThread");
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

3 个答案:

答案 0 :(得分:3)

正如javadoc

所说
  

抛出此异常表示某个线程试图在对象的监视器上等待,或者在没有指定监视器的情况下通知在对象监视器上等待的其他线程。

这意味着您的方法notifywait应该拥有监视器。或者换句话说,调用这些方法的对象必须同步。您的this对象未同步。这就是你得到这个例外的原因。在您的案例中,从lock对象调用此方法。

你的逻辑仍然是错误的,但你需要探索它。

答案 1 :(得分:3)

wait上的notifythis,但wait notifylocklock同步},你不能在其他对象上waitnotify,而不是正在同步的对象,工作版本:

class EVENODDimpl implements Runnable {
    int num;
    int temp = 0;
    Object lock = new Object();

    public EVENODDimpl( int num) {
        this.num = num;
    }

    public void run() {
        try {
            synchronized (lock) {
                while(temp<num) {
                    temp++;
                    System.out.println(Thread.currentThread().getName()+"   "+temp);
                    lock.notify();
                    lock.wait();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } 
    }
}

答案 2 :(得分:1)

java.lang.IllegalMonitorStateException异常发生是因为您在对象this.notify()上使用了notify方法,但该Object未同步。 将synchronized (lock)替换为:synchronized (this)