Dúvida (Parar Thread) [RESOLVIDO]

10 respostas
pedroroxd

Bom pessoal... No meu Frame eu tenho um botão que faz uma contagem regreciva de 30 segundos...
Quando acaba a contagem, aparece uma mensagem de "Pedido enviado com sucesso", o tempo que chegou em 0 volta para 30 (para caso eu clicar no botão novamente).
Quando o tempo chegasse em 30, a Thread deveria "morrer"...

Eu fiz uma gambiarra:
private class ClockRunnable implements Runnable {
           public void run() {
               try {
                   int t=31;
                   while (true) {
                       EventQueue.invokeLater(new Runnable() {

                           public void run() {
                           }
                       });
                       Thread.sleep(1000);
                       if (t>=1) {
                            t--;
                            String k = Integer.toString(t);
                            jLabel11.setText(k);
                       }

                       else {
                           JOptionPane.showMessageDialog(null,"Pedido enviado com sucesso.");
                           t=30;
                           //Thread.sleep(999999999);        ////////GAMBIARRA FEIAAAA!! //////                                     
                       }
                   }
               }
               catch (InterruptedException e) {
               }
           }
       }

Olhem a linha 21..
O que eu deveria fazer para a contagem parar? (Se não depois dos 30 segundos, de 1 em 1 vai ficar exibindo a mensagem "Pedido enviado com sucesso")

Click do botão:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {            
         Thread clockThread = new Thread(new ClockRunnable(), "Clock thread");
         clockThread.setDaemon(true);
         clockThread.start();
}

10 Respostas

ViniGodoy

A linha 21 deve ser

return;

Para que uma thread pare, simplesmente saia do método run.

Outra opção é fazer seu while terminar, ao invés de usar while (true):

private class ClockRunnable implements Runnable { public void run() { try { int t=30; while (t > 0) { Thread.sleep(1000); jLabel11.setText(Integer.toString(t)); t--; } JOptionPane.showMessageDialog(null,"Pedido enviado com sucesso."); } catch (InterruptedException e) { JOptionPane.showMessageDialog(null,"Pedido interrompido."); } } }

pedroroxd

Opa... Resolveu a dúvida sim..
Agora pintou outra dúvida:

Iniciar:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {    
         Thread clockThread = new Thread(new ClockRunnable(), "Clock thread");
         clockThread.setDaemon(true);
         clockThread.start();
}
Thread:
private class ClockRunnable implements Runnable {
           public void run() {
               try {
                   int t=31;
                   while (true) {                      
                       Thread.sleep(1000);
                       if (t>=1) {
                            t--;
                            String k = Integer.toString(t);
                            jLabel11.setText(k);
                       }

                       else {
                           JOptionPane.showMessageDialog(null,"Pedido enviado com sucesso.");
                           list1.clear();
                           t=31;
                           return;
                       }
                   }
               }
               catch (InterruptedException e) {
               }
           }
       }
Bom... Agora eu quero criar um botão Cancelar, que quando clica nele, a contagem VOLTAR PRO 31. Ela deve VOLTAR PRO 31, não parar.. Ex.: 10,9,8,7,6,5,4 cliquei no botão... Então a Thread para, e a contagem volta pro 31, para caso eu clique no botão começar dinovo... Como poderia fazer isso?
laudenpower

ViniGodoy:
A linha 21 deve ser

return;

Para que uma thread pare, simplesmente saia do método run.

Outra opção é fazer seu while terminar, ao invés de usar while (true):

private class ClockRunnable implements Runnable { public void run() { try { int t=30; while (t > 0) { Thread.sleep(1000); jLabel11.setText(Integer.toString(t)); t--; } JOptionPane.showMessageDialog(null,"Pedido enviado com sucesso."); } catch (InterruptedException e) { JOptionPane.showMessageDialog(null,"Pedido interrompido."); } } }

Por isso que eu digo, vivendo e aprendendo… Tinha me esquecido de como o return é útil nesses casos, nesse caso eu teria pensado em faze-la parar de processar com algum if, mas com return fica mais simples, e também não sabia que para fazer a thread parar bastava sair do run, resumindo valeu pela dica não ensinou apenas ao dono do tópico mas a mim também :slight_smile:

pedroroxd

Hehe…
Mas essa resposta foi a do primeiro tópico…
A minha segunda dúvida ainda não foi saciada :frowning:

ViniGodoy

Tem duas formas.

  1. Você pode chamar interrupt na sua thread, para que ela pare, e então recriar a thread.
  2. Você pode criar algum método no seu Runnable, para setar a variável novamente para 31.
pedroroxd

Mas como que eu vou dar interrupt na thread quando clicar no botão “CANCELAR” sendo que eu crio ela quando clico no botão “INICIAR”? :cry:

ViniGodoy

Transforme a thread num atributo da sua classe:

public class SuaClasse {
    private Thread clockThread = null;

   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {      
      if (clockThread != null) //Já foi iniciada?
          return;
      clockThread = new Thread(new ClockRunnable(), "Clock thread");  
      clockThread.setDaemon(true);  
      clockThread.start();  
   }  

   private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {      
      if (clockThread == null) //Nunca foi iniciada?
          return;
      clockThread.interrupt();  
      clockThread = null;
   }  
}

É uma bota também trocar o seu while (true) para while (!Thread.isInterrupted())

pedroroxd

Ops…
Tinha falado coisa errada…
Calmae que eu vo testar :wink:

ViniGodoy

Já corrigi.

E eu não abri chaves em nenhum dos ifs.

pedroroxd

Valew… Deu certo sim…
Brigadão ae!

Criado 25 de setembro de 2009
Ultima resposta 26 de set. de 2009
Respostas 10
Participantes 3