Como Finalizar Uma Thread

19/07/2019

0

É primeira vez que estou trabalhando com Threads. Criei duas threads, uma para rodar o gerador de relatórios (iReport) e outra para operar uma barra de progresso (JProgressBar). No entanto, mesmo usando flag, a Thread não é terminada (state - TERMINATED), ou seja, continua no estado RUNNABLE. Vejam:

package util;

import java.io.InputStream;
import java.sql.ResultSet;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JProgressBar;
import visao.TelaRelatorioCadastral;

/**
 *
 * @author JFSJUNIOR
 */
public class ControlaThread{
    private Thread threadBarraProgresso;
    private Thread threadEmissaoRelatorio;
    private final AtomicBoolean rodando = new AtomicBoolean(false);
    private JProgressBar progresso;
    private InputStream fluxo;
    private ResultSet dados;
    private TelaRelatorioCadastral tela;
    private Map param;

    public ControlaThread(JProgressBar barraProgresso, 
            InputStream caminho, ResultSet resultados, 
            TelaRelatorioCadastral telaCad, Map paramentros){
        progresso = barraProgresso;
        fluxo = caminho;
        dados = resultados;
        tela = telaCad;
        param = paramentros;
    }

    public void start(){
        threadBarraProgresso = new Thread(new Runnable(){
            @Override
            public void run() {
                rodando.set(true);
                while(progresso.getValue() < 100 && rodando.get()){
                    try {
                        Thread.sleep(100);
                        progresso.setValue(progresso.getValue() + 10);
                    } catch (InterruptedException iex) {
                        System.out.println("ERRO: " + iex.getMessage());
                    }
                }
            }
        });

        threadEmissaoRelatorio= new Thread(new Runnable(){
            @Override
            public void run() {
                if(rodando.get())
                    GeradorDeRelatorio.gerarRelatorio(fluxo, param, dados, tela);
            }
        });

        threadBarraProgresso.start();
        threadEmissaoRelatorio.start();
    }

    public void stop(){
        rodando.set(false);
        System.out.println("Finalizado");
    }
}
Tudo funciona, mas a tela que chama essa classe sempre vem setada com a última opção escolhida (em um JComboBox) e a barra de pregresso vem completada (100%). Como parar as Threads sem usar o depreciado stop(), pois com as flags não está funcionando? Onde estou errando?

Desde já agradeço.
João Júnior

João Júnior

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar