Tentando interromper uma thread?

4 respostas
fernandopaiva

Salve galera…

Tenho uma consulta no banco de dados e exibo a porcentagem desta consulta em um JProgressBar controlado por uma Thread, problema é que não estou conseguindo finalizar esta thread após ser executada.

Estou tentando assim.

Ter01DAO t01Dao = new Ter01DAO();
int qtdRegTer01 = t01Dao.getQtdReg();

private void workerTer01Combo(){
        progresso.setMinimum(0);
        progresso.setMaximum(qtdRegTer01);
        progresso.setStringPainted(true);          
                
        SwingWorker w = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {                
                new Thread(){
                    public void run(){
                        while(qtdRegTer01 >= t01Dao.getConsultaSize()){
                            progresso.setValue(t01Dao.getConsultaSize());    
                            System.out.println(t01Dao.getConsultaSize());
                        }    
                        interrupt();                    
                    }
                }.start();
                return null;
            }
            
            protected void done(){
                progresso.setValue(0);
                comboCliente.requestFocus();   
            }
        };
        w.execute();
    }

Como faco para conseguir parar essa thread ??

obrigado

4 Respostas

fernandopaiva

Estou tentando comparar os valores para conseguir parar a thread, dou um System.out em isInterrupted() me retorna true, ou seja esta interrompida…Mas não para de executar.

aqui como estou tentando agora.

private void workerTer01Combo(){

        progresso.setMinimum(0);
        progresso.setMaximum(qtdRegTer01);
        progresso.setStringPainted(true);  
        
        SwingWorker w = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {                
                buFields.block();                 
                new Thread(){                    
                    public void run(){                        
                        while(qtdRegTer01 >= t01Dao.getConsultaSize()){
                            progresso.setValue(t01Dao.getConsultaSize());
                            System.out.println(t01Dao.getConsultaSize());
                            System.out.println(qtdRegTer01 == t01Dao.getConsultaSize());                            
                            System.out.println("Interrompida: " + isInterrupted());
                                   
                            if(qtdRegTer01 == t01Dao.getConsultaSize()){
                                //se os valores forem iguais a thread é interrompida
                                interrupt();
                            }
                        }                        
                    }
                }.start();
                return null;
            }
            
            protected void done(){
                progresso.setValue(0);                
                comboCliente.requestFocus();   
            }
        };
        w.execute();
    }

Como fazer essa Thread parar de ser executada ??? Pq usando interrupt() e pegando o valor isInterrupted() == true, msm assim ela continua executando ??

obrigado

ViniGodoy

Seu while deveria ser:

while(qtdRegTer01 >= t01Dao.getConsultaSize() && !Thread.isInterrupted()){ progresso.setValue(t01Dao.getConsultaSize()); System.out.println(t01Dao.getConsultaSize()); System.out.println(qtdRegTer01 == t01Dao.getConsultaSize()); }

A thread finaliza quando sair do método run().

Não existe uma maneira de interromper o processamento de uma thread no meio. Você deve programa-la para, ao receber o interrupt, sair do while.

fernandopaiva

Galera, com interrupt() nao para a execucao de forma alguma…usei o stop() depreciado, e para na hora…affss !!.

private void workerTer01Combo(){      
        progresso.setMinimum(0);
        progresso.setMaximum(qtdRegTer01);
        progresso.setStringPainted(true);  
        
        SwingWorker w = new SwingWorker() {
            Thread t;
            @Override
            protected Object doInBackground() throws Exception {                
                t = new Thread(){                    
                    public void run(){                        
                        while(qtdRegTer01 >= t01Dao.getConsultaSize()){
                            progresso.setValue(t01Dao.getConsultaSize());
                            System.out.println(t01Dao.getConsultaSize());
                        }                        
                    }
                };
                t.start();
                return null;
            }
            
            protected void done(){
               // t.interrupt();
                t.stop(); 
                progresso.setValue(0);                
                comboCliente.requestFocus();   
            }
        };
        w.execute();
    }

Como fazer pra isso funcionar com interrupt() ???

obrigado

fernandopaiva

ViniGodoy:
Seu while deveria ser:

while(qtdRegTer01 >= t01Dao.getConsultaSize() && !Thread.isInterrupted()){ progresso.setValue(t01Dao.getConsultaSize()); System.out.println(t01Dao.getConsultaSize()); System.out.println(qtdRegTer01 == t01Dao.getConsultaSize()); }

A thread finaliza quando sair do método run().

Não existe uma maneira de interromper o processamento de uma thread no meio. Você deve programa-la para, ao receber o interrupt, sair do while.

vlw Vini…Perfeito, 100% funcional.

obrigado

Criado 2 de fevereiro de 2012
Ultima resposta 2 de fev. de 2012
Respostas 4
Participantes 2