[RESOLVIDO] Pool de threads  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Renato.Pinheiro
Thread.start()
[Avatar]

Membro desde: 10/06/2007 11:16:14
Mensagens: 31
Localização: Rio de Janeiro
Offline

Olá Pessoal,

estou desenvolvendo uma aplicação onde uma classe lê dados de joysticks e armazena estes dados (botões pressionados etc.) em um buffer, que é lido posteriormente por outra classe que processa os tais dados.

Estou usando um newCachedThreadPool para lanças essas classes em threads (estou usando Runnable) e tudo vai bem o problema é que, mesmo depois do método run() terminar, a thread não vai para dead, ficando em sleep ou waiting eternamente. Com isso, quando lanço outras threads, ao invés de usar os "slots" das que já terminaram, o newCachedThreadPool cria novos "slots" consumindo mais recursos.

Em tempo, estou usando um while(!encerrar) {.... } para controlar a execução do método run(), no final da execução faço encerrar = true.

This message was edited 1 time. Last update was at 06/06/2008 14:36:15


Atenciosamente,
Renato Pinheiro
www.gpi.ufrj.br
[WWW] [ICQ]
Renato.Pinheiro
Thread.start()
[Avatar]

Membro desde: 10/06/2007 11:16:14
Mensagens: 31
Localização: Rio de Janeiro
Offline

Hehehehe faltou a pergunta

Alguém sabe como resolver isso?

Atenciosamente,
Renato Pinheiro
www.gpi.ufrj.br
[WWW] [ICQ]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

As threads depois de voce fazer o encerrar = true.
voce tem que lançar um stop para a thread realmente acabar.

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
Renato.Pinheiro
Thread.start()
[Avatar]

Membro desde: 10/06/2007 11:16:14
Mensagens: 31
Localização: Rio de Janeiro
Offline

Mas segundo a API o método stop() está deprecated, veja:

http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#stop()

Não testei com esse cara, mas acredito que funcionaria, mas essa seria a única maneira?

Atenciosamente,
Renato Pinheiro
www.gpi.ufrj.br
[WWW] [ICQ]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Não é para parar a thread na marra.

Segundo a documentação, a thread deveria ficar ativa por até 60 segundos se não estiver ocupada.

Se precisar mudar esses parâmetros, em vez de usar Executors.newCachedThreadPool, use um dos construtores de ThreadPoolExecutor, que permite um "fine tuning" melhor.
[WWW]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Nunca usei tanto Threads por isos não sabia ams acho melhor usar a ideia do thingol.

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
Renato.Pinheiro
Thread.start()
[Avatar]

Membro desde: 10/06/2007 11:16:14
Mensagens: 31
Localização: Rio de Janeiro
Offline

thingol wrote:Não é para parar a thread na marra.

Segundo a documentação, a thread deveria ficar ativa por até 60 segundos se não estiver ocupada.

Se precisar mudar esses parâmetros, em vez de usar Executors.newCachedThreadPool, use um dos construtores de ThreadPoolExecutor, que permite um "fine tuning" melhor.


Eu vi essa informação na API, rodei o programa, fiz o atributo encerrar = true e esperei os 60 segundos e nada. As threads ficam em sleeping e não liberam os slots do newCachedThreadPool. Tentei achar um meio de setar o status delas como Dead, mas não achei nada.

Mesmo usando o shutdownnow() não resolveu, pq o shutdown não é garantido.
[WWW] [ICQ]
Renato.Pinheiro
Thread.start()
[Avatar]

Membro desde: 10/06/2007 11:16:14
Mensagens: 31
Localização: Rio de Janeiro
Offline

Bom, resolvido.

A questão é que as threads não passam para o status DEAD, elas ficam com o status WAINTING até sairem do pool, depois dos tais 60 segundos.

Para complementar, fiz uns ajustes baseado nesse exemplo:

http://www.java2s.com/Code/Java/Threads/Anotherwaytostopathread.htm

O código ficou assim:













Atenciosamente,
Renato Pinheiro
www.gpi.ufrj.br
[WWW] [ICQ]
ViniGodoy
Moderador
[Avatar]

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

Aliás, manter as threads vivas é o que torna o thread pool eficiente.

A idéia geral é reaproveitar uma linha de execução, evitando os seus tempos de criação e destruição, quando threads de curta duração são criadas.

Se vc matar cada linha de execução logo em seguida que o método run termina, sempre terá esse overhead, que as vezes pode deixar a aplicação indesejavelmente lenta.

Por isso os tais 60 segundos.

This message was edited 1 time. Last update was at 07/06/2008 08:37:46


@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]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team