[Thread] - 100% CPU [RESOLVIDO]  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

Imaginem a seguinte thread:



Fazendo a chamada desta Thread pelo construtor da seguinte maneira:



Até então tudo bem, o programa se desenvolve perfeitamente.

Agora, imaginem essa outra situação:



O que irá acontecer?

Tchauzin!

This message was edited 2 times. Last update was at 31/01/2011 15:27:28


Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
laudenpower
JavaEvangelist
[Avatar]

Membro desde: 28/12/2008 21:00:08
Mensagens: 349
Offline

Nesse caso o método receive está dentro de um while com um InputStream chamando um read?

Se for isso ele vai ficar conectado até o servidor desconectar, ou então o próprio socket fechar a conexão.

Outra coisa que notei é que se a situação acima se confirmar, vais ter duas threads inacessíveis pois no loop ao dar new nas threads você troca a referência da thread já criada pela nova thread.

Enquanto cultivares teu saber, nada tens a temer!

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

laudenpower wrote:Nesse caso o método receive está dentro de um while com um InputStream chamando um read?

Se for isso ele vai ficar conectado até o servidor desconectar, ou então o próprio socket fechar a conexão.

Outra coisa que notei é que se a situação acima se confirmar, vais ter duas threads inacessíveis pois no loop ao dar new nas threads você troca a referência da thread já criada pela nova thread.


Oi,

Sem problemas. A idéia é ter 'N' Threads para cada porta socket.

A grande questão é o uso da CPU...

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

Where are the Thread.starts() when we need them.....

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

Estranho, após rodar 2 threads em paralelo a minha CPU fica 100%.

Alguma sugestão?

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
wellington.nogueira
GUJ Ranger
[Avatar]

Membro desde: 11/08/2006 11:29:56
Mensagens: 914
Localização: Osasco-SP
Offline

Estranho teu problema.
Já vi CPU ir a 100% devido a while que criava muitas repetições num pequeno espaço de tempo.


que foi alterado para algo como


O exemplo é fictício mas era algo similar a este.
Não sei se um sleep no teu loop pode resolver este problema (ou criar novos).

57 45 4C 4C 49 4E 47 54 4F 4E
Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
"Se você acha que programar em Java com Swing é simples? Acredite em mim, não é!"
http://developmentforever.wordpress.com/
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

Sleep não resolve... =/

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
gambazinho
Java Ninja
[Avatar]
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline

conseguiram resolver o problema?
ViniGodoy
Moderador
[Avatar]

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

gambazinho wrote:conseguiram resolver o problema?


Geralmente é só dar um sleep mesmo. Não entendi pq a lina disse que no caso dela não resolveu.
O sleep precisa estar dentro do while. Quanto maior o tempo de sleep, mais ocioso ficará seu processador.

@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]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

ViniGodoy wrote:
gambazinho wrote:conseguiram resolver o problema?


Geralmente é só dar um sleep mesmo. Não entendi pq a lina disse que no caso dela não resolveu.
O sleep precisa estar dentro do while. Quanto maior o tempo de sleep, mais ocioso ficará seu processador.


Oi,

Pois então, já coloquei dentro do while e não resolveu... A questão é que não posso ficar me prendendo ao sleep, até porque o Receive() ficará em espera..

Vou ver o que faço aqui e qualquer coisa postarei o resultado.

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
ViniGodoy
Moderador
[Avatar]

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

E que classe é essa que tem o Receive? A implementação de socket do Java deveria colocar a thread para dormir automaticamente, mas como esse método está em letras maiúsculas, creio que não seja a padrão.

Se for algum tipo de socket com Selectors, ou sem espera, não seria problema usar o sleep também.

No lugar do Thread.sleep, use então o Thread.yield. Isso dará a outras threads a oportunidade de rodarem. Embora talvez não reduza muito o consumo de CPU.

This message was edited 1 time. Last update was at 27/12/2010 08:50:34


@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]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

E que classe é essa que tem o Receive? A implementação de socket do Java deveria colocar a thread para dormir automaticamente, mas como esse método está em letras maiúsculas, creio que não seja a padrão.


Realmente. O método foi sobrescrito, porém continua aguardando por dados..


No lugar do Thread.sleep, use então o Thread.yield. Isso dará a outras threads a oportunidade de rodarem. Embora talvez não reduza muito o consumo de CPU.


Não tinha pensado nesse possibilidade... vou tentar!

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
lina
Moderador
[Avatar]

Membro desde: 23/12/2006 21:05:04
Mensagens: 3083
Offline

Oi,

É... realmente o método Receive() não ficava aguardando. Tive que passar um timeout 0 para ele aguardar sempre por algum dado.

Tchauzin!

Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
http://www.guj.com.br/posts/list/50115.java

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]

@gujgirl

http://www.restartfans.hdfree.com.br

Meu blog:

http://www.runthecode.wordpress.com

Tchauzin!
[Email]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team