Thread: Dúvidas iniciais

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]

Mantu,

Não acho que o seu “stop” ficou ruim não, é uma forma de terminar a thread de uma forma natural. Dá uma lida nisso daqui:

http://www.forward.com.au/javaProgramming/HowToStopAThread.html

ASOBrasil

olá,

não poderia simplesmente utilizar um timer? Algo como uma leitura a cada 5 segundos?

t+

A idéia do bobmoe foi boa! Vc pode colocar um Thread.sleep(XXX) neste cara!

ASOBrasil