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 Runnable
tem 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;)