Thread que fica rodando mesmo depois que fecha

Oi, tenhum um objeto (JDialog), nele criei uma subclasse que extende uma thread que deve ficar executando enquanto o formulario estiver aberto. O problema eh que depois de fechar o formulario, a thread continua rodando…

COMO FINALIZA-LA?

public class MyForm(){
    
    private class MyThread extends Thread(){
             public void run(){
                while (true){
                       System.out.print(".");
                       try {
                            Thread.sleep(500);
                       }catch (InterruptedException ee){
                       }
                }
             }
    }

    MyThread t = null;

    public MyForm(){
           t = new MyThread();
           t.start();
    }
}

Ja tentou usar o finalize()?

t.finalize() nao existe!!!

pelo menos o eclipse nao mostrou essa opcao…

E cada vez que eu abro e fecho o formulario ele cria uma nova thread que vai consumindo cada vez mais memoria…

tenta fazer um if com o isVisible() ou com o isShowing() do JDialog, não sei se resolve, mas tenta assim:

if(seu_dialog.isVisible()){
		// comandos
		}
		else {
			// comandos
		}
		// Usando isShowing
		if(seu_dialog.isShowing()){
			// comandos
		}
		else {
			// comandos
		}

o finalize() não pode ser chamado por uma Thread, pq ele e extendido da classe Thread, seu uso seria:

public class Classe extends Thread {
    public Classe(){
        finalize();
    }
}

tentei isto, mas nao deu certo…

this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {
				System.out.println("fechando...");
				t.interrupt();
			}
		});

Embora chama o interrupt() no evento windowClosing, a thread continua executando, e sei que o t.interrupt() foi chamado, pq coloquei o println(“fechando…”) antes de chama-lo, ele imprime a msg FECHANDO… e depois continua printando os . que a minha trhread tah printando…

Você precisa fazer uma 'flag" para controlar o fluxo no loop. Pode ser assim:

while(formularioTaAberto)
     faça tal coisa

Daí quando ele fechar, o loop vai acabar e a thread se encerrará “naturalmente”.

eu sei, isso que eu queria evitar…

veja a versao atual da thread:

	private class ChecaModificado extends java.lang.Thread {
		private boolean sinalFechar = false;
		public void run() {
			while (!sinalFechar) {
				System.out.print(".");
				try {
					Thread.sleep(500);
				} catch (InterruptedException ee) {
					ee.printStackTrace();
				}
			}
		}
		
		public void fecha(){
			this.sinalFechar=true;
		}
	}

lah no windowClosing eu toh chamando t.fecha() e dah certo, mas gostaria de ter outro meio, pra falar a verdade, mesmo chamando o t.fecha() nao estou bem certo se a thread continua ou nao na memoria…

me corrijam se eu estiver errado, mas tente usar o System.gc() pra dar uma limpada

eh exatamente pra isso que se usa a IterruptedException. dentro do seu catch dessa exception faca sinalFechar=true, e chame o t.interrupt naquele seu listener.

pronto.

Pessoal o System.gc() seria conveniente em uma aplicação onde se esta interrompendo um Thread?

[quote=Paulo Silveira]eh exatamente pra isso que se usa a IterruptedException. dentro do seu catch dessa exception faca sinalFechar=true, e chame o t.interrupt naquele seu listener.

pronto.[/quote]

Perfeito!!!

Ficou assim:

 	private class ChecaModificado extends java.lang.Thread {
 		private boolean sinalFechar = false;
 		public void run() {
 			while (!sinalFechar) {
 				System.out.print(".");
 				try {
 					Thread.sleep(500);
 				} catch (InterruptedException ee) {
 					sinalFechar=true;
 				}
 			}
 		}
 	}

E lah no windowClosing eu soh chamo:

t.interrupt();