Duvida com Thread

olá pessoal,

estou fazendo um pequeno teste com thread… usando apenas o basico (classe Thread e interface Runnable)

e basicamente 2 classes… HardTask e ExecuteHardTask.

a HardTask implementa Runnable e faz um pequeno looping para simular um processamento…
enquanto ele estiver processando ira mostrar o seu progresso em um JProgressBar (uma classe interna de HardTask)…

a ExecuteHardTask ira criar uma Thread a partir do HardTask e executa-lo…

segue classes…

[code]
package threadProgressBar;

import java.awt.Cursor;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class HardTask implements Runnable {

ShowProgressBar showProgressBar;

public HardTask(){
	this.showProgressBar = new ShowProgressBar();
}

@Override
public void run() {

	int x = 0;
	while(x < 101){
		try {
			
			showProgressBar.getProgressBar().setValue(x++);
			
			Thread.sleep((int) (Math.random() * 500));
							
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		if(showProgressBar.getProgressBar().getValue() == 100){
			showProgressBar.getProgressBar()
				.setString(Thread.currentThread().getName() + " has been done!");
			showProgressBar.dispose();
		}	
		
	}// end while

}// end run()

/** Inner Class **/
class ShowProgressBar extends JDialog{

	private static final long serialVersionUID = 1L;

	private JProgressBar progressbar;
	
	public ShowProgressBar(){
		super(new JFrame(),"Progress Bar");
		
		this.progressbar = new JProgressBar();
		this.progressbar.setMaximum(100);
		this.progressbar.setStringPainted(true);
				
		getContentPane().add(this.progressbar);		
		getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		setSize(300,55);
		setLocationRelativeTo(null);
		setVisible(true);		
	}
	
	JProgressBar getProgressBar(){
		return this.progressbar;
	}
}// end inner class

}[/code]

[code]
package threadProgressBar;

public class ExecuteHardTask {

public ExecuteHardTask(){
}

void executeWork(){
	
	HardTask hardTask = new HardTask();
	
	Thread t = new Thread(hardTask, "Task 0ne");
	
	t.start();
			
}

public static void main (String[] args){
	
	new ExecuteHardTask().executeWork();
	
}

}[/code]

minha duvida e o seguinte… mesmo apos ter executado td o metodo Run - em HardTask - o processo ainda continua executando… como sei disso? simples e so abrir o gerenciador de tarefas (windows) e ele vai estar lá…
ou como estou usando eclipse… na aba console e me mostra q esta executando… sendo q tenho q dar um click em Stop (botãozinho vermelho ^^)…

então queria saber se isto e normal… ou se estou fazendo alguma coisa de errado?
achei meio estranho…

Jeferson

Você tá dizendo que aparecem processos distintos pra cada thread do seu programa no gerenciador de tarefas do Windows?

O(s) processo(s) continua aparecendo lá mesmo quando você fecha o frame?

Não tá faltando um frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ?

Complementando a resposta do rod.attack, para que esse comando que ele indicou funcione, vc deve extender a classe “ShowProgressBar” de JFrame ao invés de JDialog.
flw!

bom…

como o rso1988 disse devemos estender de JFrame para que o JFrame.EXIT_ON_CLOSE funcione…

usando JFrame funciona normalmente… porem queria usar o JDialog. =(

na verdade optei por JDialog pra não ficar aparecendo o botão de Minimizar e Maximizar ^^

alguem sabe como faço pra eles não aparecerem no JFrame?

e alguem sabe pq qnd uso JDialog o processo ainda continua rodando?

at.,

Jefersom

E se você usar setResizable(false); no frame ?Resolve o problema?
Creio que os botões ainda vão aparecer mas vão estar desabilitados.

usar setResizable(false) desabilita o botão maximizar… mais fica meio estranho -.-’

enfim… vou colocar o progress dentro de um Panel mesmo e vou usar o setUndecorated(true) no JFrame.
pronto!!!

mais ainda gostaria de entender o pq o processo do JDialog ainda continua =(

Acho que é por questões de segurança…pq a JDialog nem tem a constante Exit_On_Close definida.
Talvez esteja relacionado com o SecurityManager, se estiver falando bobagem por favor me avisem…hehehe

Neste caso, um System.exit(0) não ajuda em nada ?

System.exit(0) ajuda sim… quero ver ele continuar rodando… XD

porem não e muito legal usar p parar um processo… pois usando exit… ele não apenas acabara com um processo especifico mais com tds os processos do programa! estou certo? espero q sim XD

a respeito do SecurityManager… onde posso saber mais sobre ele?