Uso do wait() e notify()

E aeh galera!

Bom to com um probleminha no uso dos métodos wait() e notify().
Como usá-los da maneira correta?

A minha situação é o seguinte:
EU tenho uma thread de leitura para cada socket de conexão.
Uso o método read() de BufferedInputStream para esperar uma msg
do equipamento conectado (no meu caso, um Busca Preço, ou Terminal de Consulta).
Porém tenho de vertificar em tempos e tempos se o terminal ainda está conectado. Fiz um TimeTask para realizar a verificação.
Então, em periodos repetidos do tempo configurado, eu envio um comando para o terminal, “#live?”. Se ele estiver ativo, ele retornará. “#live”.
Como o metodo read() eh bloqueante, toda leitura de streams para um terminal especifico sera feita pela thread alocada para esse fim, ja que, na thread de leitura, o metodo esta parado no metodo read();
Entao a sequencia ficaria + ou - assim:

  1. Deu o tempo da timertask executar
  2. escreve o comando “#live?” para o terminal
  3. espera (wait()???)
  4. a thread de leitura do terminal especifico le o comando.
  5. se respondeu ou nao, libere (notify()???) a timertask para processar a resposta (ou a ausencia dela)

Valeu, brothers, quem puder me ajudar com esse problema, agradeço.

Acho que pra começar, a abstração já é inadequada (uma thread por conexão, streams blocking?). Se posso sugerir algo, imagine substitui-lo pelo MINA e/ou o QuickServer

Entenda cara, eu sei que existem melhores formas de se gerenciar threads,
mas eh que agora nao da mais…
Uso sim, uma thread para cada conexao(ate pq nao habera mais de 15…20 conexoes), uso java.io (bloqueante)… etc etc etc…
mas a questao eh:

  • tem uma tarefa a ser executada.
  • Preciso esperar um resultado para continuar.
  • Em outro ponto, eh obtido o resultado.
  • sou notificado por quem obteve o resultado
  • saio da inercia e concluo minnha tarefa

Ema ema ema, cada um com seus pobrema. :slight_smile:

Falando sério, agora: Já conferiu o metodo available() do BufferedInputStream?

Você quer dizer que eu posso usar ele para “ouvir” o terminal? Junto com um sleep, por exemplo?
Quando não há dados disponíveis, ele retorna zero???

Porque não?

Bem, se temos um BufferedInputStream, em tese, ele deveria retornar zero. Mas sugiro que faça seu próprio teste. Aliás, este é outro grande diferencial do Mina: Poder simular streams sem ter que sair do domínio da VM.