[RESOLVIDO] Thread

10 respostas
gpd38

Criei um programa usando thread. Ele é bem simplesinho, mas tenho um problemao. :smiley:

Tenho um botao iniciar que faz a thread ser executada, porem o botao nao deixa de ficar precionado e para eu executar a minha aplicaçao novamente, tenho que fechar e abrir o programa novamente.

Tem como parar a thread e recomeça-la ?

Para iniciar eu uso o start() e para parar o stop(), mas mesmo assim o botao nao libera a execuçao.

O erro é este: Exception in thread “AWT-EventQueue-0” java.lang.IllegalThreadStateException

10 Respostas

galileu.gt

Para parar uma thread o mais adequado é você mesmo gerenciar sua execução.

Um modo simples de conseguir isso é usar um flag na sua thread em execução como criterio de parada.
por exemplo, voce pode ter em sua thread um laço controlado por este flag:

public void run{

while(executandoFlag)
{
 }

}

Quando voce quiser que sua thread pare, mude o valor de executandoFlag para falso. Isso fara com que sua thread termine normalmente a execução.
Essa é uma dica, não sei se é a mais adequada.
Qualquer duvida poste.

Abraco

gpd38

Infelismente nao funcionou

Tiago.Argolo
public class ThreadSomar extends Thread{
	
	public void run()
	{
		while(true)
		{
			try
			{
				Thread.sleep(1000); // Dorme por 1 segundo.
				Principal.cont++; // Incrementa a variável "cont" da classe Principal enquanto executa o while.
			}catch(InterruptedException e)
			{
				e.printStackTrace();
			}

		}
	}

}

Main

public class Principal {

	public static int cont = 0;
	
	public static void main(String[] args) {
		
		ThreadSomar ts = new ThreadSomar();
		ts.start();
		
		while(true)
		{
			System.out.println(cont);
		}
	}
}
juliofsn

Tente diminuir a prioridade da sua Thread.
Antes de inicar a execução faça: t.setPriority(Thread.MIN_PRIORITY);

Veja se isso ajuda.

aajjbb

ainda estou iniciando em threads, nao posso ajudar muito, mas, nao entendei o significado desse while(true)

FabricioPJ

Tenta usar o SwingWorker para trabalhar com threads e Swing.

http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html

juliofsn

Isso faz a thread entrar em loop infinito e não terminar nunca, mas isso só se faz em caso de teste mesmo, normalmente se coloca uma variável ou condição de saída para que a thread termine.

blackfalcon
aajjbb:
ainda estou iniciando em threads, nao posso ajudar muito, mas, nao entendei o significado desse while(true)

Quer dizer que o while vai sempre executar. O exemplo que o Tiago.Anjolo deu esta bem feito, basta interpretar.

gpd38, sobre sua duvida, nao tem como parar uma Thread e executa-la novamente, ou causara a Exception que voce colocou.

Isso porque, uma Thread é permitida apenas usar o metodo start() uma unica vez. Mas tem como voce suspender (suspend()) e resumir (resume()) sua execução, que em outros termos, seria parar e continuar da onde parou.

Faça o teste para voce ver:

class Teste implements Runnable {
   public void run(){
      while(true){
	     System.out.println("Teste 1");
	  }
   }
}
import java.lang.Thread;

class ExecutaTeste{
   public static void main(String args[]){
      Thread t = new Thread(new Teste());
	  t.start();
	  for(int i = 0; i < 1000; i++){
	     System.out.println("Teste 2");
	  }
	  t.suspend();
	  t.resume();
   }
}

Agora, a que vai dar erro:

import java.lang.Thread;

class ExecutaTeste{
   public static void main(String args[]){
      Thread t = new Thread(new Teste());
	  t.start();
	  for(int i = 0; i < 1000; i++){
	     System.out.println("Teste 2");
	  }
	  t.stop();
	  t.start();
   }
}

Estou aprendendo tambem sobre Thread, estou lendo isso aqui:

http://oreilly.com/catalog/expjava/excerpt/index.html

Abraços

ViniGodoy

Você não pode chamar start() duas vezes sobre o mesmo objeto Thread. Você deve criar o objeto novamente usando new.

B

Thread.stop, suspend e resume estão depreciados há mais de 10 anos. Atualizem-se.

Criado 8 de junho de 2010
Ultima resposta 8 de jun. de 2010
Respostas 10
Participantes 9