Dúvida a respeito de Thread

3 respostas
L

Bom dia pessoal!

Tenha uma dúvida de como executar a minha Thread:

É o seguinte, eu tenho uma tela na qual faz uma consulta no banco de dados, e o codigo que executa a consulta está dentro de uma Thread.

minha Class Thread:

class Processo extends Thread{
		public void run(){ 
                             /// Aqui é feito a consulta, e é retornado um list de objetos e tal..
                             // aqui eu jogo os meus valores pra dentro de um JTable
			}
	    }

Ai depois eu tenho o evento no botão que dispara essa Thread:

private void btLocalizarActionPerformed(ActionEvent e) {
                // Onde p é a classe da minha Thread que criei a referencia lá em cima (Dentro da classe da minha janela)
                // Eu chamo ela dessa maneira a baixo
		SwingUtilities.invokeLater(p);
	}

Porem é o seguinte, quando eu executo ela com o ( SwingUtilities.invokeLater) a minha tela “trava” e quando eu executo
dessa forma:

new Processo().star();

O processo é executado da maneira que eu gostaria, a tela não trava e eu consigo fazer outras coisas enquanto a consulta é realizada
porem gostaria de saber qual é a diferença dessas duas maneiras de executar?

e qual a melhor maneira??

abraço

Agradeço desde já se alguem me ajudar…

3 Respostas

Eric_Yuzo

O SwingUtilities.invokeLater chama o EventQueue.invokeLater, que coloca seu Runnable na fila para ser executada dentro da thread do Swing (event dispatching), desta forma, até que seu Runnable seja executado, os componentes e janelas do Swing não são atualizados, por isso que a tela trava. Este método deve ser executado quando você quer executar alguma operação dentro da thread do Swing. Se você já está na thread do swing (tratamento de evento, por exemplo), não tem porque executar pelo EventQueue.

Um exemplo clássico de utilização do EventQueue é executar a criação de um JFrame na thread do Swing a partir da main thread:

public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new JFrame().setVisible(true); } }); }
Da segunda forma você está iniciando uma nova thread, assim ela executa separado da thread do Swing, por isso não trava a tela.

ViniGodoy

Complementando, para iniciar uma nova thread faça, no lugar de:

Isso:

Não sei de onde você tirou que o primeiro comando deveria ser usado para iniciar novas threads. Ele não cria thread nenhuma nova, só enfileira uma requisição para a thread do swing executar.

L

ViniGodoy:
Complementando, para iniciar uma nova thread faça, no lugar de:

Isso:

Não sei de onde você tirou que o primeiro comando deveria ser usado para iniciar novas threads. Ele não cria thread nenhuma nova, só enfileira uma requisição para a thread do swing executar.

Eu não disse que ele deveria ser usado para iniciar novas threads, eu só estava usando pois tinha visto em algum outro post esse comando… ai vim aqui para tirar essa dúvida sobre o código e entender como ele funciona…

Obrigado pelas dicas … Abraço

Criado 3 de fevereiro de 2011
Ultima resposta 3 de fev. de 2011
Respostas 3
Participantes 3