Używanie „notify ()” i „wait ()” zamiast „suspend ()” i „resume ()” do sterowania wątkiem

Próbuję dowiedzieć się, jak wstrzymać i wznowić wątek w Javie. UżywamApplet żeimplements Runnablema 2 przyciski „Start” i „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);                               
}

Metoda uruchamiania wątku:

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

Teraz, gdy próbuję wstrzymać lub wznowić wątek, zgłaszany jest wyjątek:

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

Uwagi:

Poprzedni kod działa doskonale, jeśli używam przestarzałych metodsuspend() iresume(), ale dokumentacja wskazuje na użycienotify() iwait() zamiast synchronizacji. Próbowałem dodać słowosynchronized doactionPerformed metoda, ale nadal rzuca wyjątek.

Czy ktoś może wyjaśnićCZEMU to nie działa i jak rozwiązać problem synchronizacji? Niewiele punktów wyjaśniania byłoby naprawdę bardzo pomocne;)

questionAnswers(3)

yourAnswerToTheQuestion