Thread - Como termina-la? :D

6 respostas
D

Opa :smiley:

Criei uma thread que fica rodando dentro de um loop e tenho uma condicao que eu deveria matar/terminar ela. Alguem pode me dar uma luz de como eu faco para matar essa thread?

Utilizo Java 6 e tudo que eu consigo fazer, é chamar um sleep pra ela :oops:

Aqui é onde eu inicio ela:

public void produtoInserido(ProdutoBean produtoBean) {
		BuscaFuncionario buscaFunc = new BuscaFuncionario(produtoBean);
		Thread threadBusca = new Thread(buscaFunc);
		threadBusca.start();
		
	}

Classe que implementa Runnable:

public class BuscaFuncionario implements Runnable {

	
	public void run() {
		boolean envioMail = false;
		while(envioMail == false){
			envioMail = true;

			try {
				logger.info("Preparando para adormer Thread");
				Thread.sleep(3 * 1000);
				logger.info("Thread Adormecida com Sucesso");
			} catch (InterruptedException e) {
				logger.error("Ocorreu um erro ao adormecer a thread: " + e);
				e.printStackTrace();
			}
		}
		//momento de matar ou terminar a thread
	}
		
}

Ql seria a melhor maneira de finalizar ela?

[]'s

6 Respostas

ViniGodoy

Você pode fazer o seu while assim:

try { while (!Thread.interrupted()) { //resto do código } } catch (InterruptedException e) { logger.info("Thread interrompida!"); }

Depois, de fora dessa thread, é só chamar o método interrupt. Ele vai sair do sleep, wait, socketchannel ou qualquer outro lugar que a thread esteja adormecida e lançar uma interrupted exception (que não é necessariamente um erro). Se vc deu o interrupt fora do while, Thread.interrupted() vai retornar true.

Outra opção é criar um método na classe BuscaFuncionario que retorne false, e faça a thread sair do while. Para que uma thread pare, basta que o código saia do método run().

W

ViniGodoy:
Você pode fazer o seu while assim:

try { while (!Thread.interrupted()) { //resto do código } } catch (InterruptedException e) { logger.info("Thread interrompida!"); }

Depois, de fora dessa thread, é só chamar o método interrupt. Ele vai sair do sleep, wait, socketchannel ou qualquer outro lugar que a thread esteja adormecida e lançar uma interrupted exception (que não é necessariamente um erro). Se vc deu o interrupt fora do while, Thread.interrupted() vai retornar true.

Outra opção é criar um método na classe BuscaFuncionario que retorne false, e faça a thread sair do while. Para que uma thread pare, basta que o código saia do método run().

se eu instanciei uma thread q tem um atributo boolean parar = false; e no meio do programa eu dei true pra esse parar e a thread terminou de executar… quando eu for dar um start nela de novo posteriormente… o atributo parar vai estar com o valor true ou false ? (isto é, a thread fica com os ultimos valores ou inicia zerada?)

A

wellingtonfoz:
ViniGodoy:
Você pode fazer o seu while assim:

try { while (!Thread.interrupted()) { //resto do código } } catch (InterruptedException e) { logger.info("Thread interrompida!"); }

Depois, de fora dessa thread, é só chamar o método interrupt. Ele vai sair do sleep, wait, socketchannel ou qualquer outro lugar que a thread esteja adormecida e lançar uma interrupted exception (que não é necessariamente um erro). Se vc deu o interrupt fora do while, Thread.interrupted() vai retornar true.

Outra opção é criar um método na classe BuscaFuncionario que retorne false, e faça a thread sair do while. Para que uma thread pare, basta que o código saia do método run().

se eu instanciei uma thread q tem um atributo boolean parar = false; e no meio do programa eu dei true pra esse parar e a thread terminou de executar… quando eu for dar um start nela de novo posteriormente… o atributo parar vai estar com o valor true ou false ? (isto é, a thread fica com os ultimos valores ou inicia zerada?)

Caso eu estiver errado me corrijam.
o metodo start() da Threard executa o metodo Run() da classe?
executando uma vez ate que parar == false, caso você execute novamente o metodo start() o parar continuara com o valor false.

ViniGodoy

Sim, ele cria uma nova Thread, que começa no método run.

Você não pode chamar start() 2 vezes.

W

Sim, ele cria uma nova Thread, que começa no método run.

Você não pode chamar start() 2 vezes.

Mas se minha thread terminou de executar? Mesmo assim não posso usar start() de novo pra ela começar de novo?

ViniGodoy

Mesmo assim. Você terá que dar um new Thread novamente. O que você pode reaproveitar é o Runnable.

Criado 27 de agosto de 2008
Ultima resposta 30 de jan. de 2012
Respostas 6
Participantes 4