Dúvida sobre Thread

6 respostas
R

Bom, eu realizo um calculo em loop através do clique do botão, mais ou menos assim:

for(int i=0;i<20;i++){
     calcularValor(i);
     MostrarIteracaoLabel(i);
 }

Vamos lá, o método MostrarIteracaoLabel deve atualizar a label da tela mostrando o valor de I, mas ou menos assim: Iteração 1 … 2… 3.

O metodo atualmente é assim:

private void MostrarIteracaoLabel(int i){
   lblIteracao.setText("ITERAÇÃO: "+i);
}

Então criei uma Classe implemetando Runnable, porém não sei como chamar o metodo MostrarIteracaoLabel de uma classe Runnable.

6 Respostas

gmmascarin

Na sua classe que implementa Runnable deve ter um método run(). Coloque nesse método o código que deverá ser chamado em uma nova thread. Na sequência, crie uma Thread e chame start nela. Exemplo:

class ClasseRunnable implements Runnable {
public void run() {
//Código assíncrono aqui.
}
}

class Teste {
public static void main(String[] args) {
ClasseRunnable c = new ClasseRunnable();
Thread t = new Thread(c);
t.start(); //Aqui começa a execução assíncrono do código informado no método run
}
}
R

Se eu tentar realizar o código abaixo me diga se esta certo:

class ClasseRunnable implements Runnable {  
public void run() {  
//Código assíncrono aqui.  
}  

public void MostrarMsg(JLabel label, String texto){
 label.setText(texto);
}
}  
  
class Teste {  
public static void main(String[] args) {  
ClasseRunnable c = new ClasseRunnable();  
Thread t = new Thread(c);  
t.start(); //Aqui começa a execução assíncrono do código informado no método run  
c.MostrarMsg(lblNeu1,"ola mundo");
}  
}
gmmascarin

Está errado. No exemplo têm 2 threads. A primeira é aquela do main. Dentro dela você está criando uma nova thread que é executada quando chama o start(). Funciona como se você estive executando um outro programa.
Coloque seu comando dentro do método run e teste.

R

Mas como vou passar o label que quero atualizar no Método Run ?

ViniGodoy

O Runnable é uma classe. Então, crie um atributo dentro da classe, e passe o label no construtor:

public class Exemplo implements Runnable { private JLabel label; public Exemplo(JLabel label) { this.label = label; } @Override public void run() { for (int i = 0; i &lt; 100000; i++) { EventQueue.invokeLater(new Runnable() { @Override public void run() { label.setText(&quot;Counting: + i&quot;); } }); Thread.sleep(1000); } } }

Uso:

Exemplo exemplo = new Exemplo(umLabelQualquer); Thread t = new Thread(exemplo); t.start();

jcranky

Só um comentário, no código do Godoy, preste atenção para o fato de que ele usou

EventQueue.invokeLater(new Runnable(){ ... });

Isso é bastante importante. Você não deve atualizar componentes da tela diretamente nas threads da aplicação.

Criado 11 de março de 2013
Ultima resposta 11 de mar. de 2013
Respostas 6
Participantes 4