Olá pessoal!
Hoje eu estava navejando pelo fórum da sun, e me daperei com um rapaz - imagino eu… - perguntando sobre como deixar o programa dele em loop lendo a porta serial, só que sem travar o programa. Na hora eu pensei: “Ah, isso deve ter algo a ver com threads!”.
Como eu nunca mexi com threads, apenas li uma vez ou outra a respeito, resolvi meter as caras e tentar fazer uma solução pro problema do rapaz. Ficou assim:
public class SerialReader implements Runnable {
private static boolean stopped = true;
//~Singleton ...................................................................
private static SerialReader instance = null;
private SerialReader(){}
public static SerialReader getInstance(){
return instance == null ? (instance = new SerialReader()) : instance;
}
//~.............................................................................
public void run() {
stopped = false;
int s = 0;
while(!stopped) {
if(s == 0 || s == Integer.MAX_VALUE/5) {
System.err.println(
"I am an SerialReader object, " +
"and I am watching the serial port"
);
s = 1;
}else
s++;
}
}
public static void stop() {
stopped = true;
}
}
class TestSerialReader implements ActionListener{
private static int
START = 0,
STOP = 1,
EXIT = 2
;
JButton[] buttons;
Thread reading;
public TestSerialReader() {
buttons = new JButton[]{
new JButton("Start reading"),
new JButton("Stop reading"),
new JButton("Exit")
};
for (JButton button : buttons)
button.addActionListener(this);
}
public void test() {
JOptionPane.showOptionDialog(
null,
"What do you want to do?",
"Serial Port Reader",
0,
JOptionPane.QUESTION_MESSAGE,
null,
buttons,
null
);
}
public void actionPerformed(ActionEvent e) {
JButton btn = (JButton)e.getSource();
if(btn == buttons[START]) {
buttons[STOP].setEnabled(true);
btn.setEnabled(false);
if(reading == null) {
reading = new Thread(SerialReader.getInstance());
reading.start();
}
}else
if(btn == buttons[STOP]) {
buttons[START].setEnabled(true);
btn.setEnabled(false);
SerialReader.stop();
reading = null;
}else
System.exit(0);
}
public static void main(String[] args) {
TestSerialReader app = new TestSerialReader();
app.test();
}
}
É claro que não tenho pretensão alguma de que esse programa esteja legal. Muito pelo contrário! Acho bem provável que deve ter um monte de coisa “não-recomendável” ou até mesmo errada.
Gostaria que os caros colegas, além de me apontar as partes em que eu comi bola, me respondessem também:
[list]Fiz bem ou mal em adotar singleton na classe SimpleReader?[/list]
[list]Pesquisando, descobri que o método stop da classe Thread está depreciado. [color=blue]Parece que ele não funciona direito[/color]… A solução que adotei parar “parar” a thread foi muito zoada?[/list]