Inativar Thread

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() ?

[quote=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() ?[/quote]

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.

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.

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

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.

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.[/quote]

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.

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

[code] 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){
        
    }
}

[/code]

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