java.lang.IllegalMonitorStateException происходит при вызове wait (); в Java [дубликаты]

1

Я написал этот java-код для простого счетчика, есть два JButtons для запуска счетчика и другой для остановки счетчика, когда я запускаю свой код и нажимаю кнопку wait (исключение java.lang.IllegalMonitorStateException), происходит (Main.java: 42). Расскажите, в чем проблема в моем коде?

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Main extends JFrame implements ActionListener, Runnable {


    JLabel time = new JLabel();
    JButton wait = new JButton("wait");
    JButton notify = new JButton("notify");
    Thread count = new Thread(this);
    int sec=0;

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

    public Main() {
        super("Counter");
        setSize(250,100);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        setVisible(true);
        add(time);
        add(wait);
        add(notify);
        notify.setEnabled(false);
        wait.addActionListener(this);
        notify.addActionListener(this);
        count.start();
    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==wait) {
            try
            {
                count.wait();
                wait.setEnabled(false);
                notify.setEnabled(true);
            }
            catch (Exception e1) {
                e1.printStackTrace();
            }
        }
        else if(e.getSource()==notify) {
            count.notify();
            wait.setEnabled(true);
            notify.setEnabled(false);
        }
    }


    public void run() {
        synchronized (this) {
            while(true) {
                time.setText(String.format("seconds=%d",sec));
                try
                {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                sec++;
            }
        }
    }   
}
Теги:

1 ответ

1

Вы должны вызывать wait() и notify() только в синхронизированных контекстах. Кроме того, у вас будет IllegalMonitorSateException.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню