Controle de execução de threads [RESOLVIDO]

6 respostas
pf_poa

Bom dia amigos!!

Sei que trabalhar com threads é mto complicado para quem está iniciando em Java, mas é extremamente necessário utilizá-las na minha aplicação .
Preciso determinar um tempo de execução para as threads, por exemplo, as tarefas devem ser executadas a cada 15 segundos e ao final mostrar ao usuário em hh:mm:ss qndo foi a última execução.
Minha aplicação consistem em uma tela onde o usuário seleciona os checkboxes das tarefas que deseja executar. Conforme elas vão sendo chamadas aparece qndo foi a última execução até que o usuário clique em cancelar. Segue abaixo o exemplo de uma das threads que estou utilizando…

public class ThreadTeste extends CarregaConfig implements Runnable{
	String ip = super.carregaTasks("ipteste");
	String porta = super.carregaTasks("porta");
	String diretorio = super.carregaTasks("diretorioteste");
	String tarefa1 = super.carregaTasks("tarefateste");
	String logteste = super.carregaTasks("logteste");
	URL url;
	public void run() {
		try {
			url = new URL(ip + diretorio + tarefa1);
							    
			URLConnection conn = url.openConnection();
		    conn.setConnectTimeout(30000); //Seta um tempo de timeout  
		    conn.setReadTimeout(30000); //Seta um tempo de timeout
		    
			InputStreamReader in = new InputStreamReader(conn.getInputStream(), Charset.forName("ISO-8859-1"));
		    BufferedReader reader = new BufferedReader(in);
		    FileWriter conteudo = new FileWriter(new File("C:\\teste\\" + logteste));
		    PrintWriter saida = new PrintWriter(conteudo, true);
		    String linha = ""; 
		    
		    while ((linha = reader.readLine()) != null) {
		    	saida.println(linha + "\n");		    	   		     	
		    }     
		    reader.close();

		    } catch (MalformedURLException e){ 
		    	e.printStackTrace();
		    } catch (IOException e) { 
		    	e.printStackTrace();
		    }   // openConnection() falhou  
	}

Meu problema é o seguinte…
Como determinar o tempo. Quero que a thread repita a cada 15 segundos
Como saber qndo foi a última execuçao.

Se alguém puder me ajudar, estou precisando com mta urgencia!!
Valeu!!

6 Respostas

J

Use a classe javax.swing.Timer :wink:

no construtor você passa o intervalo de tempo em milissegundos e um ActionListener, que conterá a ação que deve ser executada naquele intervalo de tempo. e para pegar a hora da última execução, você pode armazenar a data e hora atual da execução em um objeto Date, e mostrá-lo para o usuário.

int delay = 1000; //milliseconds

ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //...Perform a task...
    }
};
new Timer(delay, taskPerformer).start();
Jedi_FeniX

Se quiser pode usar o Quartz é um framework de agendamentos e ele trabalha com Threads, muito bom :wink: !!!
http://www.opensymphony.com/quartz/

pf_poa

Gostei da idéia da classe Timer mas minha tela já está pronta e na verdade as terafas começam a ser executadas qndo o usuário clica em um botão start, ou seja, ele seleciona as tarefas (checkBox) e clica no botão start. Ai fica complicado pq para criar um Timer preciso passar um ActionListener, pelo o que eu entendi, ele já iria iniciar a thread com uma simples seleção do checkbox sem precisar do botão e ñ é assim que deve funcionar.

Segue abaixo +ou- o meu actionPerformed. Na verdade não sei se pode ser assim…

private void jButton2ActionPerformed(String evt) {
    	if(jCheckBox1.isSelected()){
    		ThreadTeste teste = new ThreadTeste();
    		Thread t1 = new Thread(teste);
    		t1.start();    		
    		jLabel2.setText("true");
    	}else{
    		jLabel2.setText("false");
    	}
    	if(jCheckBox2.isSelected()){
    		ThreadTeste2 teste2 = new ThreadTeste2();
    		Thread t2 = new Thread(teste2);
    		t2.start();    		
    		jLabel5.setText("true");
    	}else{
    		jLabel5.setText("false");
    	}
}

Preciso de uma idéia para isso. Valeu a atenção!!

pf_poa

Obs: as threads estão separadas já que preciso que elas executem simultaneamente. É assim que se faz neh??

Não sei se tem como fazer da maneira que estou pensando…

1° dúvida - Passar o tempo de 15 segundos na própria thread, definir isso no run mesmo, ñ sei.

2° dúvida - E quanto a mostrar na tela a última execução pensei em trabalhar isso no if que testa se o checkBox está selecionado e alterar os JLabels para a última execução assim que a thread encerrar a tarefa.

Alguém pode me exclarecer essas dúvidas??

pf_poa

Dei uma olhada na api e encontrei a classe java.util.Timer acho que seria o ideal só ñ sei como utilizar… alguém teria um exemplo??

http://java.sun.com/javase/6/docs/api/

Valeu!!

pf_poa

Só para encerrar o tópicp… usei Timer e TimerTask e funcionou!!

Criado 26 de maio de 2009
Ultima resposta 29 de mai. de 2009
Respostas 6
Participantes 3