Aviso entre threads [RESOLVIDO]

10 respostas
daniloruziska

Olá pessoal,

não tenho muito contato com a linguagem java, e agora vou ter que usar pra valer na faculdade (uso de threads) e estou com algumas dúvidas:

tenho um jogo de adivinhação, onde o usuário deve acertar um número de 0 a 100. Essa lógica eu consegui fazer dentro de uma classe que implementa Runnable.

A orientação do exercício é que se crie uma thread secundária, que deve aguardar um período de 30 segundos e avisar a thread principal que o tempo acabou.

A thread principal, recebendo essa notificação deve avisar sobre time-out e encerrar o jogo (ou seja, “se encerrar”).

Pois bem, a minha dúvida é a seguinte:

como fazer para que uma thread notifique a outra?

Apenas uma observação minha:

  1. Eu tentei usar o wait e notify, mas quando usei o wait a minha thread principal parou (achei que isso fosse ocorrer mesmo), e não é a intenção do programa, pois enquanto os 30 segundos da thread secundária se passam, a thread principal deve continuar rodando e o usuário deve ir chutando os números.

Desde já agradeço!

10 Respostas

felipehand

Não seria Thread.sleep(300); ???

edmarr

felipehand:
Não seria Thread.sleep(300); ???

Este eh o tempo que ira demorar para a Thread ser execultada .

felipehand

Humm é mesmo, o programa ficaria parado e nao esperando o usuario…realmente desculpe

edmarr

3º HJ ?

lina

Oi,

Você utilizou bloco synchronized?

Tchauzin!

felipehand

Ta de perseguição??? ¬¬

lina

Oi,

Analisando da seguinte maneira.:

1 - Criar 2 threads (Uma para o processamento do joguinho e outra para o tempo de 30 segundos).
2 - Execute o start na thread que irá aguardar 30 segundos e logo em seguida start na thread principal.
3 - Sua thread de tempo ficará em wait por 30 segundos (Enquanto a sua de processamento continuará rodando, até ser interrompida)
4 - Acabando os 30 segundos da thread de tempo, você irá dar um interrupt na thread de processamento.
5 - Que teoricamente estará em looping até ser interrompida.
6 - Fim do programa, resultado do usuario.

Tchauzin!

gomesrod

Esse aviso pode ser dado através de algum atributo que ambas as threads tenham acesso. Por exemplo, uma flag indicando se o tempo combinado ja passou.

Mais ou menos assim:
class Timer implements Runnable {
     boolean tempoEsgotado = false;
     public void run() {
       // Ai vem a rotina de contagem do tempo.
       // Quando acabar, mude tempoEsgotado para true
     }
}

class Jogo {
 void jogar() {
   Timer timer = new Timer();
   Thread threadTimer = new Thread(timer);
   threadTimer.start();
   while(!timer.tempoEsgotado) { // O loop continua enquanto nao acabar o tempo
       // Aqui vai a rotina do jogo (tentativas do usuario)
   }  
 }
}

Talvez precise de algumas melhorias para funcionar legalzinho, mas a idéia é essa.

Espero ter ajudado!

daniloruziska

Consegui resolver com a ajuda de vocês, muito obrigado!

edmarr

Não Esqueça de editar o Título adicionando a tag [RESOLVIDO] no final do Título , Depois tirar suas duvidas.

Bom Estudo .

Criado 3 de setembro de 2009
Ultima resposta 4 de set. de 2009
Respostas 10
Participantes 5