Duvida com Thread

7 respostas
Jeferson_Manetti

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...
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
	
}
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();
		
	}
	
}

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

7 Respostas

rodrigo.bossini

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); ?

rso1988

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!

Jeferson_Manetti

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

rodrigo.bossini

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.

Jeferson_Manetti

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 =(

rodrigo.bossini

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 ?

Jeferson_Manetti

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?

Criado 26 de novembro de 2008
Ultima resposta 26 de nov. de 2008
Respostas 7
Participantes 3