Senhores, bom dia.
Estou tentando me aprofundar em Threads, mas ainda me embanano com wait() e notify().
No meu teste, quando eu tento pausar a Thread, a Thread continua funcionando e o JFrame congela!
:shock:
Estou postando o código, é pequeno, só o básico, e eu peço a gentileza de alguém que conhece Threads me dar umas dicas do uso de wait() e notify()...
Notem que na minha classe interna eu utilizei Rodavel.this a fim de obter a tranca (lock) da instância da classe interna, e não da externa... assim mesmo não funciona e eu não entendo onde estou errando...
Obrigado desde já!
:wink:
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
public class T1 extends JFrame {
private JButton pausa;
private JButton continua;
private Thread t;
private Rodavel r;
public T1(){
super("Threads Test");
initThread();
initWindow();
}
private void initThread() {
r = new Rodavel();
t = new Thread(r);
t.start();
}
private void initWindow(){
pausa = new JButton("Pausa");
continua = new JButton("Continua");
pausa.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
r.pausa();
}
});
continua.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
r.continua();
}
});
this.setLayout(new FlowLayout());
this.add(pausa);
this.add(continua);
this.pack();
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
private class Rodavel implements Runnable{
public void run(){
while(true){
System.out.println("tick");
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
}
}
public void pausa(){
synchronized(Rodavel.this){
try {
Rodavel.this.wait();
} catch (InterruptedException e) {}
}
}
public void continua(){
synchronized(Rodavel.this){
Rodavel.this.notify();
}
}
}
public static void main(String[] args) {
new T1();
}
}