Inativar Thread

6 respostas
evertonsilvagomesjav

Pessoal quando eu uso o Thread.activeCount() me retorna o numero de threads ativas na app.
Com isso eu pego a thread que eu quero dessa forma:

Thread.enumerate(threads); for (Thread thread : threads) { if (thread.getName().equalsIgnoreCase("JOB 1")) { thread.interrupt(); } }

Mas quando eu testo novamente o Thread.activeCount() a thread interrompida está nas Ativas, tem como eu interromper e inativar a thread pra ela nao vir dentro do grupo da activeCount() ?

6 Respostas

J

evertonsilvagomesjava:
Pessoal quando eu uso o Thread.activeCount() me retorna o numero de threads ativas na app.
Com isso eu pego a thread que eu quero dessa forma:

Thread.enumerate(threads); for (Thread thread : threads) { if (thread.getName().equalsIgnoreCase("JOB 1")) { thread.interrupt(); } }

Mas quando eu testo novamente o Thread.activeCount() a thread interrompida está nas Ativas, tem como eu interromper e inativar a thread pra ela nao vir dentro do grupo da activeCount() ?

Você não pode inativar um thread e achar que ela vai parar sem antes terminar o que ela tinha de fazer. A thread pŕecisa terminar o trabalho e depois parar. Talvez seja por isso que a contagem ainda mostra o recurso que deveria estar descarregado naquele momento.

evertonsilvagomesjav

Mas a ideia é ela não terminar mais o que tinha que fazer, era pra abortar mesmo e não fazer mais nada. O interrupt() esta fazendo isso, pelo menos acho que esta.

G

Tem vários métodos para “matar” uma thread, procura na documentação que você acha.

ViniGodoy

O pior é que não acha, porque isso que você falou não existe. Ou melhor, até existe, mas é deprecated.

Everton, no caso o interrupt() vai fazer todas as chamadas a wait(), sleep() e similares dispararem a tal InterruptedException. Você deve programar sua thread para que, no caso de uma exceção dessas, ela pare.

Além disso, é interessante também colocar o while da sua thread assim:

try { while (!Thread.isInterrupted()) { //Codigo aqui } } catch (InterruptedException e) { } finally { //Código de finalização aqui }

Note que assim a Thread irá parar (em pouco tempo). O InterruptedException tira a thread do while e, caso a thread não esteja num wait() ou sleep(), o while é interrompido no próximo laço. Assim também a thread limpa elegantemente os recursos (fecha conexões de banco, arquivos, etc) antes de finalizar.

J

O pior é que não acha, porque isso que você falou não existe. Ou melhor, até existe, mas é deprecated.

Everton, no caso o interrupt() vai fazer todas as chamadas a wait(), sleep() e similares dispararem a tal InterruptedException. Você deve programar sua thread para que, no caso de uma exceção dessas, ela pare.

Além disso, é interessante também colocar o while da sua thread assim:

try { while (!Thread.isInterrupted()) { //Codigo aqui } } catch (InterruptedException e) { } finally { //Código de finalização aqui }

Note que assim a Thread irá parar (em pouco tempo). O InterruptedException tira a thread do while e, caso a thread não esteja num wait() ou sleep(), o while é interrompido no próximo laço. Assim também a thread limpa elegantemente os recursos (fecha conexões de banco, arquivos, etc) antes de finalizar.

Isso. O laço em execução não é interrompido para não quebrar o programa. Dessa maneira leva certo tempo para ela parar de forma segura(e dependendo da tarefa isso leva alguns segundos). Imagino que por isso ele esteja vendo o recurso alocado ainda.

evertonsilvagomesjav

Opa, Vinicius bom dia. Tentando seguir como vc falou eu tenho o trecho de codigo onde a execução deve parar

public void executar(ParametroRelatorio parametroRelatorio) {

        try{
                           
            calcularCustoModel = (ICalcularCustoModel) instanciarComponente("calcularCustosModelImpl");
            model = (IManterParametroRelatorioModel) instanciarComponente("manterParametroRelatorioModelImpl");
            classificacaoCustoModel = (IManterClassificacaoCustoModel) instanciarComponente("manterClassificacaoCustoModelImpl");
            formatacaoServicoModel = (IManterFormatacaoServicoModel) instanciarComponente("manterFormatacaoServicoModelImpl");
            unidadeNegocioPostalService = (IUnidadeNegocioService) instanciarComponente("unidadeNegocioServiceImpl");

            CustoOrigemDestinoFiltro filtro = new CustoOrigemDestinoFiltro();

            ordenarListas(parametroRelatorio);

            montarFiltro(filtro, parametroRelatorio);

            boolean isSomenteOrigemSelecionada = Boolean.FALSE;
            if (parametroRelatorio.getListFormatacaoOrigemRelatorio() != null
                    && parametroRelatorio.getListFormatacaoOrigemRelatorio().size() == 1) {
                isSomenteOrigemSelecionada = Boolean.TRUE;
            }

            boolean isSomenteDestinoSelecionada = verificarSomenteDestinoSelecionado(parametroRelatorio);
            if (isSomenteDestinoSelecionada) {
                Integer abaDestinoSelecionada = null;
                FormatacaoOrigemRelatorio formatacaoOrigemRelatorio = parametroRelatorio.getListFormatacaoOrigemRelatorio()
                        .get(0);
                abaDestinoSelecionada = verificarAbaDestinoSelecionada(formatacaoOrigemRelatorio);
                filtro.setAbaDestinoSelecionada(abaDestinoSelecionada);
            }

            boolean isNenhumaDRDestino = verificarNenhumDestinoSelecionado(parametroRelatorio);

            if (parametroRelatorio.getExtensaoRelatorio()
                    .equalsIgnoreCase(ExtensaoRelatorioEnum.PDF.getExtensao().substring(1))) {
                gerarArquivoPDF(isSomenteOrigemSelecionada, isSomenteDestinoSelecionada, isNenhumaDRDestino, filtro,
                                parametroRelatorio);
            } else if (parametroRelatorio.getExtensaoRelatorio().equalsIgnoreCase(ExtensaoRelatorioEnum.XLS.getExtensao()
                                                                                          .substring(1))) {
                gerarArquivoXLS(filtro, parametroRelatorio);
            } else {
                gerarArquivoODS(filtro, parametroRelatorio);
            }
                    
        }catch(InterruptedException e){
            
        }
    }

Como esse InterruptedException e checked como vou usa-lo ai? Sendo que nada vai disparar ele no try-catch, o compilador não deixa.

A outra coisa é que, quem vai parar essa Thread que executa esse método é outra Thread com isso esse método em execução poderia parar em qualquer parte, ao chamar o interupt() dessa Thread isso acontece certo? Acho que não precisaria desse while

Criado 2 de setembro de 2013
Ultima resposta 3 de set. de 2013
Respostas 6
Participantes 4