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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar