Executar tarefas em threads e interromper por timeout  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

Caros,

Tenho um sistema que precisa executar múltiplas tarefas em parelelo e para isso usei o conceito de pool de threads.

A principio desenvolvi uma solução para atender meus requisitos. Porém estou apanhando para fazer com que cada tarefa execute dentro de um período de timeout ou então seja interrompida.

Segue uma a implementação (obviamente simplificada) para uma possível ajuda.

Este interrupt() não tem efeito sobre a thread em execução, pois a thread a ser interrompida não faz uso de nada da APi de Threads que lance um InterruptedException (ex: Thread.sleep()).

Sei que poderia usar o Thread Pool do Java, com Executor, mas ainda não vi uma forma clara de fazer esse timeout da execução da tarefa.

Sugestões?

This message was edited 2 times. Last update was at 02/06/2011 19:05:35


gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

Coloquei "stop" no lugar de "interrupt" na linha 112 e funcionou neste teste ai. Porém, no sistema real não rolou não. Ele não para a thread.

gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Não tem como simplesmente interromper a execução de uma Thread. Você deveria ter lido o javadoc ameaçador do método stop(), lá você veria que ele não deve ser usado em hipótese alguma.

Você só consegue garantir um timeout se o comando que sua thread executa puder ser executado aos poucos. Nesse caso, use o System.currentTimeMillis() para obter quanto tempo transcorreu desde o início do processamento e saia do loop da thread se o timeout estourar. Seria como deixar seu método process assim:


Se você quiser uma threads, use o interrupt(). Mas seu método terá que ser programado para isso, já que o interrupt() apenas sinaliza o desejo de uma thread externa de interromper a thread que receber o interrupt().
Além do sleep e wait, vc pode testar o valor Thread.isInterrupted() para saber se o interrupt foi chamado.

This message was edited 2 times. Last update was at 02/06/2011 20:30:22


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

Pois é Viny. Me alertei ao fato de "stop" e "destroy" serem deprecated, porém era a última tentativa de tentar abortar threads do meu processo.

O fato é que estas threads executam tarefas que eu não tenho controle sobre a execução, ou seja, não posso executar aos poucos e abortar sua execução.

Porém, acreditei que eu poderia simplesmente abortar a execução geral de uma thread "por fora", mas vejo que não dá mesmo.

Conhece alguma solução para o caso?

Acabei também achando um "bug" na aplicação e coloquei um timeout em um serviço HTTP que tava dando problema. Acho que resolvi pontualmente o problema aqui, porém, nada impede que outros "timeouts" possam ocorrer e meu sistema entra em "hang".

gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Se os métodos não dão suporte, não tem solução. =/

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
soaresinfo
JavaEvangelist
[Avatar]

Membro desde: 27/07/2003 15:40:13
Mensagens: 373
Localização: Uberlândia/MG
Offline

Não teria como você forçar uma exceção nesta tarefa? Por exemplo, se estiver lendo algum socket ou arquivo, tenta dar um close no stream ou mudar algum atributo do objeto. Desta forma estaria forçando um erro na tarefa e saindo do hang.

Anuncie aqui!
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

Até poderia criar um método "cancel" na minha thread e ela chamar o "close" ou algo do tipo do Stream. É uma ideia sim. Posso testar.

gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team