Usando "notify ()" e "wait ()" em vez de "suspend ()" e "resume ()" para controlar um thread

Estou tentando aprender como pausar e retomar um thread em java. Estou usando umApplet naquelaimplements Runnabletem 2 botões "Start" e "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);                               
}

O método de execução do encadeamento:

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

Agora, sempre que tento pausar ou retomar o encadeamento, uma exceção é lançada:

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

Notas:

O código anterior é executado perfeitamente se eu usar os métodos obsoletossuspend() eresume(), mas a documentação aponta para usarnotify() ewait() em vez disso, com sincronização. Eu tentei adicionar a palavrasynchronized aoactionPerformed método, mas ainda lança a exceção.

Alguém pode por favor explicarPORQUE isso não está funcionando e como resolver o problema de sincronização? Poucos pontos de explicação seriam de muita ajuda;)

questionAnswers(3)

yourAnswerToTheQuestion