[Thread] - 100% CPU [RESOLVIDO]

12 respostas
L

Oi,

Imaginem a seguinte thread:

private final Thread ThreadListen() {

   return (new Thread(new Runnable() {

      public void run() {

         while (!io_th_listen.isInterrupted()) {

            byte[] lo_receive = io_sk.Receive(); // Socket, ficará aqui até receber algo.

         }
      }
   }));
}
Fazendo a chamada desta Thread pelo construtor da seguinte maneira:
io_th_listen = ThreadListen();

// Tests if this thread is alive ...
if (!io_th_listen.isAlive()) {

   // Causes this thread to begin execution.
   io_th_listen.start();
}

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

Agora, imaginem essa outra situação:

for (int i = 0; i < 3; i++) {

   io_th_listen = ThreadListen();
			
   // Tests if this thread is alive ...
   if (!io_th_listen.isAlive()) {

      // Causes this thread to begin execution.
      io_th_listen.start();
   }
}

O que irá acontecer?

Tchauzin!

12 Respostas

L

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.

L

laudenpower:
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!

L

Oi,

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

Tchauzin!

L

Oi,

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

Alguma sugestão?

Tchauzin!

L

Oi,

Sleep não resolve… =/

Tchauzin!

G

conseguiram resolver o problema?

V

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.

L

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!

V

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.

L

Oi,

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

Não tinha pensado nesse possibilidade… vou tentar!

Tchauzin!

L

Oi,

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

Tchauzin!

W

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

while(isPaused()) { Thread.sleep(10); }

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).

Criado 22 de dezembro de 2010
Ultima resposta 22 de dez. de 2010
Respostas 12
Participantes 5