Finalizar uma Thread

10 respostas
M

Boa noite pessoas.

Estou rachando a cabeça mas, até agora não consegui resolver isto aqui.

Segue o código abaixo:

final Progress p = new Progress("Carregando..."); p.setVisible(true); SwingWorker worker = new SwingWorker(){ @Override protected Object doInBackground() throws Exception { JOptionPane.showMessageDialog(null,"Teste"); return null; } @Override protected void done() { p.dispose(); } }; worker.execute();

Quando eu confirmo o JOptionPane, a Thread do SwingWork ainda fica executando.

Como faço para cancelar essa Thread quando eu finalizado o que estou fazendo dentro do SwingWork?

10 Respostas

JonaTHANNM

tenta este código no seu método done():

p.dispose();
worker.cancel(true);
M

Jonatan, bom dia.

Agradeço seu retorno .

Fiz da forma que vc falou porém, ele passou pela função e não parou a Thread.

Segue uma imagem para sua verifiação onde identifica bem que a Thread continua rodando ainda.

Essa função é uma consulta ao nome de usuário no banco para realizar o login. A primeira tentativa, eu errei e fiz outra. Ele carregou a thread da primeira tentativa e criou outra thread.

JonaTHANNM

na documentação diz que este método irá falhar se ela já foi concluída, cancelada ou por algum outro motivo… tenta colocar talvez um try catch nela para ver se consegue identificar o por que que não está conseguindo ser finalizada…
http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

L

Essa thread não é para ser “morta”. Ela é um deamon do ThreadPool de execução de SwingWorkers (mais detalhes, na API do Java).

Ela fica “parada” em um park(), esperando novas tarefas para executar. Se você apertar “pause” quando a thread estiver selecionada, você verá isso.

Portanto, pode deixar ela lá. Ela faz nada, consome quase zero recurso… E quando seu programa terminar, ela termina sozinha.

M

Joanatn e Leo, agradeço as resposatas.

Entendi Leo…o que eu posso fazer então é executar de alguma forma apenas 1 SwingWork na classe principal e sempre que for realizar alguma coisa, eu utilizo o mesmo para não criar outra thread correto?

drsmachado

Se for uma barra de progresso, manda um setVisible(false) e se ela for requisitada novamente, apenas zera o contador e dá um setVisible(true);

M

Entendi…eu peguei esse pedaço de código como exemplo e apliquei ele em vários lugares.

Vou tirar esse SwingWork então e deixar apenas true false a barra de progresso com os valores.

Pessoas, mto obrigado pela ajuda!

Abraços!

drsmachado

Não, não.
O swingworker é preciso para fazer a barra progredir em uma thread separada.
Ele deve continuar…

M

Entendi…

Nesse caso então, vou tentar utilizar apenas 1 para o programa inteiro sempre que for executar uma barra, eu inicio apenas o q eu executar na primeira classe.

Vou fazer esse teste e depois retorno para informar se deu certo.

Falow.

M

Fala pessoas, boa noite!

Esse tópico está antigo porém, ainda não consegui resolver.

Conforme mencionado nas mensagens acima, a cada SwingWork criado, o sistema cria uma Daemon Thread e ao lado fica com a observação de “(Running)”.

A minha idéia é colocar barras de status em cada ação do programa como abrir uma tela diferente, solicitar um relatório. Porém, a cada vez que selecionar uma opção que tenha o Worker, o sistema irá criar outra thread e o que me preocupa é o Running ao lado, que dá a entender que está usando recursos do computador.

Após finalizar cada ação do Worker, não é possível finalizar ou “parar” essa thread? Se ela ficar dessa forma, atrapalha o desempenho do sistema?

Até mais!

Criado 25 de maio de 2011
Ultima resposta 22 de abr. de 2012
Respostas 10
Participantes 4