[Dúvida] Isto é uma thread?

4 respostas
K

Salve GUJeiros!

Estou com algumas dúvidas e gostaria de pedir uma ajuda:

Vou implementar uma aplicação P2P utilizando JXTA para a troca de informações, mas precisamente anúncios de Web Services, entre os computadores da rede.

O código abaixo mostra o envio de uma mensagem utilizando Pipe (retirei algumas partes para diminuir o código).

Minhas dúvidas são as seguintes:

O método public void outputPipeEvent(OutputPipeEvent event) é um listener que ficará escutando os eventos de saída no Pipe.

Este método é uma thread?
O código que está sendo executado dentro dele está rodando em uma thread?
Minha aplicação poderia estar, por exemplo, recebendo uma mensagem enquanto o código desse método é executado?

Qual seria o propósito dos métodos?

synchronized (lock) {
    lock.wait();
}
.
.
.
 synchronized (lock) {
    // done.
     lock.notify();
}

Espero que tenham entendido as dúvidsa… qualquer coisa tento explicar melhor. hehe

Obrigado.
[]'s

public class PipeClient implements OutputPipeListener {
        private final Object lock = new String("lock");
    
        public static void main(String args[]) {
             PipeClient client = new PipeClient(waitForRendezvous);
             client.start();
        }
       
     
        public synchronized void start() {
             try {
                 if (waitForRendezvous) {
                     System.out.println("Waiting for Rendezvous Connection");
                     //wait indefinitely until connected to a rendezvous
                     manager.waitForRendezvousConnection(0);
                     System.out.println("Connected to Rendezvous, attempting to create a
                 }
                 

                 pipeService.createOutputPipe(pipeAdv, this);
                 try {
                     synchronized (lock) {
                          lock.wait();
                     }
                 } catch (InterruptedException e) {
                     System.out.println("Thread interrupted");
                 }
             } catch (IOException e) {
                 System.out.println("OutputPipe creation failure");
                 e.printStackTrace();
                 System.exit(-1);
             }
        }
      
        public void outputPipeEvent(OutputPipeEvent event) {
             outputPipe = event.getOutputPipe();
             Message msg;
             try {
                 outputPipe.send(msg);
                 System.out.println("message sent");
             } catch (IOException e) {
                 System.out.println("failed to send message");
                 e.printStackTrace();
                 System.exit(-1);
             }
             stop();
        }

	public void stop() {
    	   // Close the output pipe
      	   outputPipe.close();
      	   // Stop JXTA
     	   manager.stopNetwork();
       	   synchronized (lock) {
             // done.
             lock.notify();
           }
        }
}

4 Respostas

fantomas

Se entendi direito:

  1. O método outputPipeEvent não é uma thread, porem está sob o domínio de uma. Significa que enquanto a thread está sendo executada em dado momento ela executa este método.

  2. Este código provoca uma espera na execução do código observado, porem a thread permanece em execução.

synchronized (lock) { lock.wait(); }

  1. Faz com o código observado saia do estado de espera e continue a execução.

synchronized (lock) { // done. lock.notify(); }

flws

K

fantomas:
Se entendi direito:

  1. O método outputPipeEvent não é uma thread, porem está sob o domínio de uma. Significa que enquanto a thread está sendo executada em dado momento ela executa este método.

  2. Este código provoca uma espera na execução do código observado, porem a thread permanece em execução.

synchronized (lock) { lock.wait(); }

  1. Faz com o código observado saia do estado de espera e continue a execução.

synchronized (lock) { // done. lock.notify(); }

flws

valeu fantomas!

só um dúvida: no caso quando vc diz “código observado”, seria o método outputPipeEvent() ?

[]'s

fantomas

Não!

Me refiro ao método start da classe PipeClient.

Dá uma olhada na API Java na classe Object, no seu caso (Object lock = new String(“lock”); ) que vc verá a descrição da ação do método wait.

A idéia geral é a seguinte: Enquando o objeto gerado pela classe PipeClient fica em estado de espera, uma thread permanece em execução acionando o método outputPipeEvent; observe esta linha pipeService.createOutputPipe(pipeAdv, this); a referencia this (objeto da classe PipeClient foi passada como parametro, porisso que o “milagre” acontece.

P.S Esta é a minha interpretação do código apresentado.

flws

K

fantomas:
Não!

Me refiro ao método start da classe PipeClient.

Dá uma olhada na API Java na classe Object, no seu caso (Object lock = new String(“lock”); ) que vc verá a descrição da ação do método wait.

A idéia geral é a seguinte: Enquando o objeto gerado pela classe PipeClient fica em estado de espera, uma thread permanece em execução acionando o método outputPipeEvent; observe esta linha pipeService.createOutputPipe(pipeAdv, this); a referencia this (objeto da classe PipeClient foi passada como parametro, porisso que o “milagre” acontece.

P.S Esta é a minha interpretação do código apresentado.

flws

valeu fantomas!

[]'s

Criado 8 de julho de 2009
Ultima resposta 8 de jul. de 2009
Respostas 4
Participantes 2