IllegalMonitorStateException notify()和wait() [英] IllegalMonitorStateException notify() and wait()

查看:162
本文介绍了IllegalMonitorStateException notify()和wait()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题。当我在synchronized块中使用 notify()时,我有IllegalMonitorStateException。任何人都可以帮我解决这个问题吗?

I have a problem. When I use notify() in synchronized block I have IllegalMonitorStateException. Can anyone help me to solve this problem?

我必须这样做,一个线程将发送到第二个线程char,然后这个线程必须等待,第二个线程打印这个焦炭。在第二个线程等待之后,第一个线程再次发送下一个char

I have to do that, one thread will send to second thread char, then this thread has to wait and second thread print this char. After that second thread wait, and first one again send next char

Main.java:

Main.java:

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
public class Main extends JFrame {

    Thread t1, t2;
    Consumer con;

    public Main() {
        con = new Consumer();
        startThreads();
    }

    private synchronized void startThreads() {
        t1 = new Thread(new Producent("grudzien", con));
        t1.start();
        t2 = new Thread(con);
        t2.start();
    }

    public class Producent implements Runnable {

        String m_atom;
        char[] atoms;
        Consumer m_c;

        public Producent(String atom, Consumer c) {
            m_atom = atom;
            m_c = c;
        }

        @Override
        public void run() {
            synchronized (this) {
                atoms = m_atom.toCharArray();
                System.out.print("Tablica znaków: ");
                for (int i = 0; i < atoms.length; i++) {
                    System.out.print(atoms[i] + ", ");
                }
            }
            for (int i = 0; i < atoms.length; i++) {
                synchronized (this) {
                    con.setChar(atoms[i]);
                    t2.notify();
                    try {
                        wait();
                    } catch (InterruptedException ex) {
                        JOptionPane.showMessageDialog(null, "Blad w wait()", "Blad!", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }

        }
    }

    public class Consumer implements Runnable {

        char atom;

        public void setChar(char c) {
            atom = c;
        }

        @Override
        public void run() {
            while (true) {
                synchronized (this) {
                    try {
                        wait();
                    } catch (InterruptedException ex) {
                        JOptionPane.showMessageDialog(null, "Blad w wait()", "Blad!", JOptionPane.ERROR_MESSAGE);
                    }
                    System.out.println(atom);
                    t1.notify();
                }
            }
        }
    }

    public static void main(String[] args) {
        new Main();
    }
}


推荐答案

你需要成为对象监视器的所有者才能在其上调用通知。到目前为止,你的方法都是 synchronized(this),但是他们在其他对象上调用notify()(它们没有同步)。换句话说:

you need to be the "owner of the object's monitor" to be able to call notify on it. so far your methods are all synchronized(this), yet they call notify() on other objects (that they are not synchronized on). in other words:

synchronized(t2) {
   t2.notify();
}

synchronized(t1) {
   t1.notify();
}

有关java中监视器和同步的完整说明,请参阅这里,或者在SO上查找类似的问题,就像这一个 - Java等待和通知:IllegalMonitorStateException

for a complete explanation of monitors and synchronization in java, see here, or look for similar questions here on SO, like this one - Java Wait and Notify: IllegalMonitorStateException

这篇关于IllegalMonitorStateException notify()和wait()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆