Acordando Thread

7 respostas
S

Olá, estou com uma dúvida quanto a utilização de threads. Eu consigo ou posso criar dois “acordadores” de thread tipo wait(5000) e mais algum? Tenho o seguinte código:

public class UpStatus extends Thread{
	boolean running = true;
	
	UpStatus () {

	}
	
	public void run () {
		try {
			while (running) {
				CalcCapacity();			
				wait(5000);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Bom, tenho a thread acima, esta a cada 5s irá executar o método CalcCapacity(), eu consigo fazer com que outra thread externa ative esta mesma thread? Neste meu caso entao teria duas situação onde ela executa a cada 5s e também pode exetuar a cada 2s, 3s ou 1s

Consigo fazer isso? Alguem poderia me auxiliar.

Não sei se este post é no forum basico, mas como sou iniciante postei aqui.

7 Respostas

R

se vc quiser que uma thread externa ative essa thread, ela deve ter o controle do while e não do sleep

no codigo que escrevi abaixo, a variável permite é controlada pela outra thread e revisada a cada 0,5 segundos

desse modo, enquanto permite for verdadeiro, vai dormir… qndo a outra thread quiser acordar essa, vai dar false no permite
e na outra thread vc controla de qto em qto tempo vc quer ver isso… 1s, 5s, 10s…

detalhe… o tempo das threads acontecerem não é preciso lembre-se disso… seu SO tem um “controle maior” sobre as threads do q vc ( vc pode querer despertar em 1s, o seu SO pode desperta-la em 3s )

public class UpStatus extends Thread{  
    boolean running = true;  
    boolean permite = true;
      
    UpStatus () {  
  
    }  
      
    public void run () {  
        try {  
            while (running) {  
                CalcCapacity();  
                while( permite ) {
                 wait(500); 
                }         
                permite = true; 
            }  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

    public void setPermissao( boolean permissao ) {
         permite = permissao;
    }

}
S

Eu acho que não me expressei bem. O thread UpStatus pode ser executado em duas situações, a cada 5s ou quando uma thread externa ativar ela. Neste seu exemplo, faz isso. Desculpa amigo mas não entendi.

rogelgarcia

Chame o método notify() ou notifyAll() do seu objeto UpStatus

Acho que você tem que estar com o lock do objeto… não lembro bem… tipo synchronized(upStatus ) upStatus.notifyAll();

rogelgarcia

Eu colocaria a sua funcionalidade em outra classe.

Uma classe controla a funcionalidade e outra controla a thread.

(só uma questão organizacional)

S

Como assim, explique melhor e exemplifique

rogelgarcia

Você fala a questão de organização?

Colocaria o calcCapacity(); em outra classe E COM LETRA MINUSCULA ( por exemplo uma classe Calculator)

Aí vc teria que fazer

calculator.wait(500);

e

calculartor.nofityAll();

Como disse é só questao organizacional… nao muda a funcionalidade

B

redr4gon poderia me dar um exemplo mais completa de funcionamento?

Criado 25 de junho de 2011
Ultima resposta 10 de jul. de 2011
Respostas 7
Participantes 4