Parar uma Thread no meio de sua execução e depois começar ela do zero

11 respostas
SirDominque

Gente, estou fazendo uma thread no meu programa, que fica atualizando uma jTable.
Eu ativo ela, clicando no JToggleButton. Mantendo ela ativa.
Quando clico novamente, ela deveria parar.E se eu clicasse novamente, ela deveria começar do zero.

Quando eu ativo ela pela primeira vez, ela funciona.
Mas quando mando parar e executar de novo, gera diversos Erros…

O que devo fazer?

Classe View :

private boolean activeUpdate = true;
....
  private void jToggleButton_KeepUpdatingActionPerformed(java.awt.event.ActionEvent evt) {
       
        
        if(activeUpdate == false)
        {
          cc.stopTableUpdate();
          activeUpdate = true;
        } else if(activeUpdate == true)
            {
                cc.keepTableUpdated();
                 activeUpdate = false;
            }
        
        
        
        
        
    }

Classe que Controla a parada e a execução :
//Classe CentralControle

public void keepTableUpdated()
    {
        System.out.println("Method to start Thread commencing...");
       
        if (keepTable.isInterrupted())
        {
            
        } else {
        keepTable.start();
    }
    }
    
    public void stopTableUpdate()
    {
        //keepTable.setStop(false);
        keepTable.interrupt();
    }

Classe da Thread :

package KeepAliveAndUpdated;

import Controle.CentralControle;
import java.util.logging.Level;
import java.util.logging.Logger;

public class KeepTable extends Thread{
    public CentralControle cc;
    private boolean stop = false;
 
    public KeepTable(CentralControle c)
    {
        cc = c;
    }
    
    @Override
    public void run()
    {
   
     while(stop ==false )
     {
        
            try {
                this.sleep(5000); // 5 segundos
                   cc.check();
                  
            } catch (InterruptedException ex) {
                System.out.println("Thread Error - Please Contact Developer");
                stop = true;
            }
     
     }
     
    }

    public boolean isStop() {
        return stop;
    }

    public void setStop(boolean stop) {
        this.stop = stop;
    }
    
    
    

}

11 Respostas

mauricioadl

vc pode colocar a thread pra dormir, qndo quiser q ela volte basta da um interrupt.

rmendes08

Ué, porque você não chama stop() e cria a thread novamente ?

mauricioadl

nao deve ser usado o stop da classe thread (vide javadoc). O correto seria fazer o metodo run terminar.

SirDominque

O stop() esta deprecado e também pode gerar erros.

Vou tentar do jeito que o mauricio me disse…

rmendes08

nao deve ser usado o stop da classe thread (vide javadoc). O correto seria fazer o metodo run terminar.

Verdade, tinha me esquecido que stop() é deprecated. Que seja o método interrupt() então. Mas como eu disse, depois ele precisa criar uma nova Thread.

SirDominque

nao deve ser usado o stop da classe thread (vide javadoc). O correto seria fazer o metodo run terminar.

Verdade, tinha me esquecido que stop() é deprecated. Que seja o método interrupt() então. Mas como eu disse, depois ele precisa criar uma nova Thread.

rá´´aáá

funcionou usando interrupt.
Porém ele da esse erro:

“sleep interrupted”

e Outra coisa, essas threads interrupteds, irão ficar consumindio processamento memória?

rmendes08

nao deve ser usado o stop da classe thread (vide javadoc). O correto seria fazer o metodo run terminar.

Verdade, tinha me esquecido que stop() é deprecated. Que seja o método interrupt() então. Mas como eu disse, depois ele precisa criar uma nova Thread.

rá´´aáá

funcionou usando interrupt.
Porém ele da esse erro:

“sleep interrupted”

e Outra coisa, essas threads interrupteds, irão ficar consumindio processamento memória?

Processamento não, memória sim. Mas como eu disse, ao reiniciar o processamento você deverá criar uma nova Thread. Se você não manter a referência para a Thread antiga então ela será coletada pelo GC.

SirDominque
Processamento não, memória sim. Mas como eu disse, ao reiniciar o processamento você deverá criar uma nova Thread. Se você não manter a referência para a Thread antiga então ela será coletada pelo GC.
public KeepTable keepTable = new KeepTable(this);   
...

public void keepTableUpdated()
    {
        System.out.println("Method to start Thread commencing...");
       
        keepTable = new KeepTable(this);
        keepTable.start();
    
    }

Desse Jeito ele esta mantendo a referencia ?

rmendes08
Andre Lopes:
Processamento não, memória sim. Mas como eu disse, ao reiniciar o processamento você deverá criar uma nova Thread. Se você não manter a referência para a Thread antiga então ela será coletada pelo GC.
public KeepTable keepTable = new KeepTable(this);   
...

public void keepTableUpdated()
    {
        System.out.println("Method to start Thread commencing...");
       
        keepTable = new KeepTable(this);
        keepTable.start();
    
    }

Desse Jeito ele esta mantendo a referencia ?

Sem olhar o código todo não dá pra saber. Se você cria a Thread em uma variável pública, existem grandes chances de você não deixar ela ser levada pelo GC, pois você não sabe como a instância será usada.

SirDominque

Então , na verdade essas são as únicas partes em que a thread é referenciada. No resto do código e nas outras classes, nao tem nada dessa thread.

rmendes08

Andre Lopes:
Então , na verdade essas são as únicas partes em que a thread é referenciada. No resto do código e nas outras classes, nao tem nada dessa thread.

Faça-a private então, só para garantir. E eu ainda faria diferente, faria KeepTable implementar Runnable ao invés de estender Thread, e faria o lançamento da trhead assim:

private  KeepTable keepTable = new KeepTable(this);     
...  
  
public void keepTableUpdated()  
    {  
        System.out.println("Method to start Thread commencing..."); 

        Thread t1 = new Thread(keepTable); 

        t1.start();        
    }
Criado 20 de setembro de 2012
Ultima resposta 21 de set. de 2012
Respostas 11
Participantes 3