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