Verwenden Sie "notify ()" und "wait ()" anstelle von "suspend ()" und "resume ()", um einen Thread zu steuern

Ich versuche zu lernen, wie man einen Thread in Java anhält und wieder aufnimmt. Ich benutze eineApplet Dasimplements Runnablehat 2 Tasten "Start" und "Stop".

public void init(){
  th = new Thread(this);
  th.start();

  btn_increment = new Button("Start");
  btn_increment.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ev){
      th.notify();
    }
  });
  add(btn_increment);

  btn_decrement = new Button("Stop");
  btn_decrement.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ev){
      try{
        th.wait();
      } catch(InterruptedException e) {
        e.printStackTrace();
      }
    }
  });

  add(btn_decrement);                               
}

Die Ausführungsmethode des Threads:

public void run(){
  while(true){
    repaint();
    try{
      Thread.sleep(20);
    } catch(InterruptedException e) {
      e.printStackTrace();
    }
  }
}

Wenn ich jetzt versuche, den Thread anzuhalten oder fortzusetzen, wird eine Ausnahme ausgelöst:

Exception in thread "AWT-EventQueue-1" java.lang.IllegalMonitorStateException

Anmerkungen:

Der vorherige Code läuft einwandfrei, wenn ich die veralteten Methoden verwendesuspend() undresume(), aber die Dokumentation weist auf die Verwendungnotify() undwait() stattdessen mit Synchronisation. Ich habe versucht, das Wort hinzuzufügensynchronized zumactionPerformed Methode, aber es löst immer noch die Ausnahme.

Kann mir bitte jemand erklärenWARUM Das funktioniert nicht und wie kann man das Synchronisationsproblem lösen? Wenige Erklärungspunkte wären wirklich hilfreich;)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage